javascript - Anropa konstruktor från härledd typ via this i typescript


I mitt TypeScript försöker jag skapa/klona ett barnobjekt via en metod i basklassen. Detta är min (förenklade) uppsättning.

abstract class BaseClass<TCompositionProps> {
    protected props: TCompositionProps;

    protected cloneProps(): TCompositionProps { return $.extend(true, {}, this.props); } // can be overwriten by childs

    constructor(props: TCompositionProps){
        this.props = props;
    }

    clone(){
        const props = this.cloneProps();
        return this.constructor(props);
    }   
}

interface IProps {
    someValues: string[];
}

class Child extends BaseClass<IProps>{
    constructor(props: IProps){
        super(props);
    }
}

Nu ska jag skapa ett nytt objekt

const o1 = new Child({someValues: ["This","is","a","test"]};

// get the clone
const clone = o1.clone();

Konstruktören träffas (men det är bara anropet till funktionen), vilket betyder att inget nytt objekt skapas. När jag istället använder return Child.prototype.constructor(props) får jag mitt nya objekt.

Så hur kan jag kalla konstruktorn för Child i dess basklass?

Försökte det här också

Svar #1

Du kan anropa konstruktorn med new-operatorn, det verkar fungera. Jag skulle också använda this för returtypen så att clone-metoden returnerar den avledda typen och inte basklassen.

abstract class BaseClass<TCompositionProps> {
    protected props: TCompositionProps;

    protected cloneProps(): TCompositionProps { return $.extend(true, {}, this.props); } 

    constructor(props: TCompositionProps){
        this.props = props;
    }

    clone() : this{
        const props = this.cloneProps();
        return new (<any>this.constructor)(props);
    }   
}

Relaterade artiklar