簡體   English   中英

ES6 mixins的Typescript定義

[英]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/7225https://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM