[英]Typescript generics and functions as class attribute type
我有以下代碼:
class Test<T> {
value: T | (() => T);
determineValue(): T {
if (typeof this.value === 'function') {
return this.value();
}
return this.value;
}
}
編譯器在調用return this.value()
的行中給我一個錯誤:
error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '(() => T) | (T & Function)' has no compatible call signatures.
我不知道這里到底有什么問題。 如何確保該value
是T
類型或函數返回T
類型的值。
目前,我有一個解決方法,(我認為)這不是很好:
return (<() => T>this.value)();
有人能幫我嗎? 謝謝! :-)
如果調用者將T
設置為函數類型(例如T = (x: number) => number
)並傳遞類型T
的值(即,需要單個參數的函數),則您的代碼實際上是不正確的。 您的代碼將嘗試不帶參數的情況下調用此函數。
通過使用具有相同屬性但沒有調用簽名的映射類型來約束T
,可以向編譯器提示您不希望T
成為函數類型。 也就是說,您可以將Test
類的聲明更改為:
class Test<T extends { [P in keyof T]: T[P] }> { /* ... */ }
然后錯誤應該消失。 但是,編譯器不會阻止您實際使用函數類型實例化T
,因為函數類型的確擴展了相同的類型,並且刪除了調用簽名,因此請當心。 (因此,我很驚訝上述技術可以消除錯誤。可以說,缺少錯誤可能是一個錯誤。如果該錯誤得到修復,我想您只是回到當前的解決方法。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.