2016-10-04 67 views
1

我正在使用第三方JavaScript庫,它使用"mixin"模式向任意對象添加屬性。我希望TypeScript知道這些屬性而不使用繼承或將它們明確地添加到類型定義中。使TypeScript知道在運行時通過mixin添加到對象的方法

function ThirdParty(objectToMutate: any): void { 
    objectToMutate.newMethod = function(): void { ... } 
} 

class MyClass { ... } 

var myObject = new MyClass(); 

ThirdParty(myObject); 

myObject.newMethod(); 

有沒有一種方法,使打字稿認識myObject.newMethod()不增加newMethodMyClass和不改變ThirdParty?我對猴子補丁很好。

+1

如何如果它不知道它,它會認出它嗎? – 2016-10-04 17:36:54

+0

我可以改變第三方組件的接口聲明,可以類型轉換等。我希望有一種方法可以告訴打印機編譯器「下列屬性已經添加到'myObject'」 – alexanderbird

回答

1

您可以定義由添加方法(S)的接口,然後有函數的返回式傳遞的an intersection這個新的接口:

interface ThirdPartyInstance { 
    newMethod(): void; 
} 

function ThirdParty<T>(objectToMutate: T): T & ThirdPartyInstance { 
    (objectToMutate as any).newMethod = function(): void { }; 
    return objectToMutate as T & ThirdPartyInstance; 
} 

class MyClass { } 

var myObject = ThirdParty(new MyClass()); // myObject is of type MyClass & ThirdPartyInstance 

myObject.newMethod(); 

code in playground