2017-12-31 159 views
1

Gehen Sie von einem vorhandenen JavaScript-Framework aus, für das Sie Typisierungen erstellen möchten. Der Javascript-Code verwendet Node.js Module, prototypische Vererbung und Mixins:Beschreiben von Mixins in einer Deklarationsdatei

// File: src/lib/a.js 

function A() { 
    this.isA = true; 
    this.type = 'a'; 
} 

module.exports = A; 

// File: src/lib/b.js 

var A = require('./a'); 
var plugin = require('./plugin'); 

function B() { 
    A.call(this); 
    this.isB = true; 
    this.type = 'b'; 
    plugin(this); 
} 

B.prototype = object.create(A.prototype); 
B.prototype.constructor = B; 

module.exports = B; 

// File: src/lib/plugin.js 

function plugin(obj) { 
    obj.doSomethingFancy = function() { 
    // ... 
    } 
} 

module.exports = plugin; 

Wie würden Sie in einer Deklarationsdatei beschreiben B so dass es vermittelt, dass einige Mitglieder von/über den Konstruktor erstellt werden?

Antwort

0

Brauchen Sie diese Unterscheidung wirklich? Ihre Konstruktoren erstellen immer diese Member. Wenn Sie also ein Objekt vom Typ B haben, können Sie sicher sein, dass diese Eigenschaften vorhanden sind.

Wenn Sie signalisieren möchten, dass ein Mitglied möglicherweise nicht existiert - Suffix ist sein Name mit ? wie ich für doSomethinFancy im Beispiel unten getan habe.

class A { 
    public isA: boolean; 
    public type: string; 

    constructor() { 
     this.isA = true; 
     this.type = 'a'; 
    } 
} 

function plugin(obj: any): any { 
    obj.doSomethingFancy = function() { 
     // ... 
    } 
} 

class B extends A { 
    public isB: boolean; 

    // same could be used for optional function arguments 
    public doSomethingFancy?:() => {}; 

    constructor() { 
     super(); 
     this.isB = true; 
     this.type = 'b'; 
     plugin(this); 
    } 
} 
+0

Diese Frage bezieht sich auf Umgebungsdeklarationen, nicht auf die Implementierung. Nehmen Sie außerdem an, dass eine untergeordnete Klasse möglicherweise entscheidet, ihren übergeordneten Konstruktor nicht aufzurufen. – ciss

+1

@ciss Ich bin mir nicht bewusst, wie die Tatsache, dass Mitglieder vom Konstruktor erstellt werden, vermittelt werden kann. Wenn du die Möglichkeit eines unbestimmten Mitglieds vermitteln willst, suffixe es mit '?', Wie 'isA?'. Apropos abgeleiteter Typ, der den Basistyp-Konstruktor nicht aufruft, dies führt wahrscheinlich zu einem TS-Fehler, aber wenn dies nur eine Bibliotheksdefinition ist, können Sie Ihren Compiler anweisen, Fehler in externen Bibliotheken zu ignorieren. –