2016-10-04 45 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