592 Stimmen

Konstruktorüberladung in TypeScript

Hat jemand Konstruktor Überladen in TypeScript getan. Auf Seite 64 der Sprachspezifikation (v 0.8) gibt es Anweisungen, die Konstruktorüberladungen beschreiben, aber es wurde kein Beispielcode angegeben.

Ich probiere gerade eine ganz einfache Klassendeklaration aus, die so aussieht,

interface IBox {    
    x : number;
    y : number;
    height : number;
    width : number;
}

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor(obj: IBox) {    
        this.x = obj.x;
        this.y = obj.y;
        this.height = obj.height;
        this.width = obj.width;
    }   

    constructor() {
        this.x = 0;
        this.y = 0;
        this.width = 0;
        this.height = 0;
    }
}

Wenn mit tsc BoxSample.ts ausgeführt wird, wirft es eine doppelte Konstruktordefinition aus - was offensichtlich ist. Jede Hilfe ist willkommen.

34voto

Joe Punkte 1265

Ich weiß, dies ist eine alte Frage, aber neu in 1.4 sind Union-Typen; verwenden Sie diese für alle Funktionsüberladungen (einschließlich Konstruktoren). Beispiel:

class foo {
    private _name: any;
    constructor(name: string | number) {
        this._name = name;
    }
}
var f1 = new foo("bar");
var f2 = new foo(1);

17voto

Kostas Drak Punkte 3187

Eigentlich könnte es für diese Antwort zu spät sein, aber Sie können dies jetzt tun:

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor();
    constructor(obj: IBox);
    constructor(obj?: IBox) {    
        this.x = !obj ? 0 : obj.x;
        this.y = !obj ? 0 : obj.y;
        this.height = !obj ? 0 : obj.height;
        this.width = !obj ? 0 : obj.width;
    }
}

so dass Sie anstelle von statischen Methoden das oben Genannte tun können. Ich hoffe, es hilft Ihnen!!!

9voto

Yacine Punkte 921

Sie können dies tun, indem Sie :

class Box {
  x: number;
  y: number;
  height: number;
  width: number;
  constructor(obj?: Partial<Box>) {    
     assign(this, obj);
  }
}

Partial macht Ihre Felder (x,y, Höhe, Breite) optional und erlaubt mehrere Konstruktoren

z.B.: Sie können tun new Box({x,y}) ohne Höhe und Breite.

7voto

Mudlabs Punkte 551

Ihr Box Klasse wird versucht, mehrere Konstruktor-Implementierungen .

Nur der letzte Konstruktor Überlastsignatur wird als Klasse verwendet Implementierung des Konstruktors .

Beachten Sie im folgenden Beispiel die Implementierung des Konstruktors ist so definiert, dass es no einer der vorstehenden Aussagen widersprechen Überlastsignaturen .

interface IBox = {
    x: number;
    y: number;
    width: number;
    height: number;
}

class Box {
    public x: number;
    public y: number;
    public width: number;
    public height: number;

    constructor() /* Overload Signature */
    constructor(obj: IBox) /* Overload Signature */
    constructor(obj?: IBox) /* Implementation Constructor */ {
        if (obj) {
            this.x = obj.x;
            this.y = obj.y;
            this.width = obj.width;
            this.height = obj.height;
        } else {
            this.x = 0;
            this.y = 0;
            this.width = 0;
            this.height = 0
        }
    }

    get frame(): string {
        console.log(this.x, this.y, this.width, this.height);
    }
}

new Box().frame; // 0 0 0 0
new Box({ x:10, y:10, width: 70, height: 120 }).frame; // 10 10 70 120

// You could also write the Box class like so;
class Box {
    public x: number = 0;
    public y: number = 0;
    public width: number = 0;
    public height: number = 0;

    constructor() /* Overload Signature */
    constructor(obj: IBox) /* Overload Signature */
    constructor(obj?: IBox) /* Implementation Constructor */ {
        if (obj) {
            this.x = obj.x;
            this.y = obj.y;
            this.width = obj.width;
            this.height = obj.height;
        }
    }

    get frame(): string { ... }
}

4voto

Ardeshir Valipoor Punkte 106
interface IBox {
    x: number;
    y: number;
    height: number;
    width: number;
}

class Box {
    public x: number;
    public y: number;
    public height: number;
    public width: number;

    constructor(obj: IBox) {
        const { x, y, height, width } = { x: 0, y: 0, height: 0, width: 0, ...obj }
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X