[英]Typescript definition for ES6 mixins
有沒有辦法為ES6混合編寫Typescript定義?
我在library.js
有這個模式,我想創建library.d.ts
// declaration in `library.js`
class Super extends Simple {
constructor() {}
static Compose(Base = Super) {
return class extends Base {
// ...
}
}
}
// usage in `client.js`
class MyClass extends Super.Compose() {}
let myInstance = new MyClass();
class MyOtherClass extends Super.Compose(AnotherClass) {}
不,Typescript類型系統對此沒有足夠的表現力 - 請參閱https://github.com/Microsoft/TypeScript/issues/7225和https://github.com/Microsoft/TypeScript/issues/4890中的討論。
打字稿中慣用的“類型”寫成
interface Constructor<T> {
new (...args): T;
}
因此,為Compose編寫聲明的一種方法是
export declare class Simple {}
export declare class Super extends Simple {
static Compose<T>(Base?: Constructor<T>): Constructor<T & {/*mixed-in declarations*/}>
}
也就是說,Compose返回類型被聲明為交集類型的構造函數 - 一種必須具有參數(Base)的所有屬性以及mixin的所有屬性的類型。
你可以像這樣使用那個聲明(假設它在library.d.ts文件中)
import {Super} from './library'
let MyComposed = Super.Compose(Super)
let myInstance = new MyComposed
稍有不便之處在於您總是必須為Super.Compose()提供參數,因為在不知道default參數值的情況下類型推斷不起作用,並且您無法在聲明文件中為default參數提供值。
但是最大的問題是你無法真正使用Compose的結果作為一個類:
class MyClass extends Super.Compose(Super) {}
因上述問題而無法編譯:
error TS2509: Base constructor return type 'Super & {}' is not a class or interface type.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.