[英]typescript tricky grammar in mixins
type Constructor<T> = new (...args: any[]) => T;
function f1<T extends {}>(naked: Constructor<T>): any {
return class dressed extends naked { } // error
}
function f2<T extends Constructor<{}>>(naked: T): any {
return class dressed extends naked { } // ok
}
f1
表示'dressed' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '{}'.
我不認為f1
有任何語義錯誤,但為什么會出現語法錯誤?
令人困惑的是Constructor<T>
類型,因為實際上我們永遠無法在類 mixin 語法中指定其泛型參數T
有了更簡單/非通用的定義,我們自然可以選擇編寫一個類 mixin,如f2
:
type Constructor = new (...args: any[]) => any;
function Dressed<T extends Constructor>(Base: T) { // Note: no `: any` return type so that the type inference works.
return class extends Base {}
}
如果我們在其他地方需要一個通用的Constructor
類型,我們仍然可以指定一個默認類型來繼續編寫<T extends Constructor>
,這會引起誤解:
type Constructor<T = {}> = new (...args: any[]) => T;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.