2017-12-31 77 views
1

入力を作成する既存のJavascriptフレームワークを想定します。 JavaScriptコードは、Node.jsのモジュール、プロトタイプの継承とミックスインを使用しています:それはいくつかのメンバーは、そのコンストラクタで/によって作成されていることを伝えるように宣言ファイルにミックスインを記述する

// 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; 

はどのように宣言ファイルにBを説明しますか?

答えて

0

本当にこの区別が必要ですか?あなたのコンストラクタは常にこれらのメンバを作成するので、タイプがBのオブジェクトがあれば、それらのプロパティがそこにあることを確認できます。

メンバーが存在しない可能性がある場合は、doSomethinFancyのように?という名前で接尾辞を付けてください。

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

この質問は実装に関するものではなく、周囲の宣言に関するものです。また、引数のために、子クラスがその親コン​​ストラクタを呼び出さないことを決定するかもしれないと仮定します。 – ciss

+1

@ciss私は、メンバーがコンストラクターによって作成されたという事実を伝える方法を知らない。メンバが未定義である可能性を伝えたい場合は、 '? 'と接尾辞をつけてください(' isA?'のように)。派生型ではなく、基本型のコンストラクタを呼び出すとTSエラーが発生する可能性がありますが、これが単なるライブラリ定義であれば、外部ライブラリのエラーを無視するようにコンパイラに指示できます。 –

関連する問題