2017-03-02 4 views
1

私はこのような基本的な機能を提供機能があります。NPMモジュール内からインターフェースにプロパティを追加

// File 1: Core function 
export const extensions = []; 
export interface ResultInterface { 
    fullname:string, 
    age:number 
} 

function maFunction():ResultInterface { 
    var o = { 
     fullname:"alex", 
     age:21 
    }; 
    extensions.forEach((extension) => o = extension(o)); 
    return o; 
} 

あなたはmaFunction上記のコードから見ることができるようにextensionsを通して見ることによって拡張可能ですそれらの機能を適用することができます。

例えば、一つはNPMを通じて、次の拡張機能をインストールすることができます。

// File 2: Extensions 1 (installed via NPM) 
extensions.push(function (o) { 
    o.ageInMonths = o.age * 12; 
    return o; 
}); 


// File 3: Extensions 2 (installed via NPM) 
extensions.push(function (o) { 
    o.firstname = o.fullname.split(" ")[0]; 
    o.lastname = o.fullname.split(" ")[1]; 
}); 

を今すぐユーザーランドに:私は活字体が追加されたプロパティを検出するのに十分にスマートであることを期待していなかった

// File 4: Userland execution 
var myVar = maFunction(); 

myVar.ageInMonths // error: Property 'ageInMonths' does not exist on type 'ResultInterface'. 
myVar.firstname // error: Property 'firstname' does not exist on type 'ResultInterface'. 
myVar.lastname // error: Property 'lastname' does not exist on type 'ResultInterface'. 

拡張機能を介してしかし、どのエクステンションを手動で追加することができますか?それぞれの拡張機能はどのようにしてResultInterfaceを拡張し、独自のプロパティを追加できますか?私は考えていない

答えて

0

ResultInterfaceの.d.tsを変更せずにこれを実行することが可能である(その応答ここを参照してください:Extend interface defined in .d.ts file)を

あなたはmyVarを入力し、強化するためにIntersection typesを使用している「カントー何ができますかそれはあなたが必要とする機能を備えたインターフェイスです:

var myVar: ResultInterface & {ageInMonths: number, firstname: string, lastname: string} = maFunction(); 

あなたは、このような「タイプのショートカット」を追加することができます:

type ResultInterfaceAugmented = {ageInMonths: number, firstname: string, lastname: string}& ResultInterface; 
var myVar: ResultInterfaceAugmented = maFunction(); 
関連する問題