有没有办法为下面的混合帮助器编写一个Typescript定义?
我在library.js中有这种模式,我想创建library.d.ts
// declaration in `library.js`
var mixin = {
example: function {}
}
function addMixin(instance) {
instance.example = mixin.example;
return example;
}
// usage in `client.js`
class MyClass {}
let myInstance = addMixin(new MyClass());
答案 0 :(得分:2)
一种可能的方法是使用泛型类型参数T声明addMixin,并使用mixin类型将addMixin返回类型声明为T的intersection type。
为了实现这个目的,必须以某种方式声明addMixin参数以允许赋值给example
属性 - 再次,交集类型,但这次使用可选的example
属性可以做到这一点。
然后,你必须使用类型转换为addMixin
返回值 - 有一种type guard可以表示它总是有一个example
属性会很高兴在赋值之后,但是类型转换现在会执行它。 (我假设你想从中返回instance
,你问题中的return example
会给出关于未定义example
}的错误。
因此,打字稿中的addMixin
实现看起来像
var mixin = {
example: function () { }
};
function addMixin<T>(instance: T & { example?() }): T & { example() } {
instance.example = mixin.example;
return instance as T & { example() };
}
如果实际的实现是在javascript中你只需要声明文件,它可能看起来像
// declaration in library.d.ts
declare function addMixin<T>(instance: T & { example?() }): T & { example() };
// implementation in library.js
var mixin = {
example: function() {}
};
function addMixin(instance) {
instance.example = mixin.example;
return instance;
}
// can be used in client.ts with library.d.ts
// tsc client.ts library.d.ts
class MyClass {}
let myInstance = addMixin(new MyClass());
myInstance.example();