簡體   English   中英

Typescript泛型和功能作為類屬性類型

[英]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.

我不知道這里到底有什么問題。 如何確保該valueT類型或函數返回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.

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