foo 類型表示一個函數(shù),它既可以返回 promise<string>,也可以返回 promise<any>。這等價于以下函數(shù)重載聲明:
function foo(): Promise<string>; function foo(): Promise<any>;
當調(diào)用一個重載函數(shù)時,Typescript 編譯器會嘗試找到“最合適”的簽名來匹配調(diào)用。通常,它會選擇列表中第一個匹配的簽名。
例如:
function foo(x: string): number; function foo(x: number): string; function foo(x: string | number) { return typeof x === "string" ? x.length : x.toFixed(1) } const n = foo("abc"); // resolves to first call signature // const n: number const s = foo(123); // resolves to second call signature // const s: string
在上面的例子中,foo("abc") 調(diào)用會匹配第一個簽名,因此 n 的類型被推斷為 number。foo(123) 調(diào)用會匹配第二個簽名,因此 s 的類型被推斷為 string。
當嘗試從重載函數(shù)類型中進行類型推斷時,Typescript 編譯器通常只會從最后一個簽名進行推斷。這在某些情況下可能會導(dǎo)致意外的結(jié)果。
例如:
type FooRet = ReturnType<typeof foo> // type FooRet = string // ^^^^^^^^^^^^^^^^^^^^ not (string & number) or [string, number]
ReturnType<typeof foo> 會推斷出 string 類型,而不是 string & number 或 [string, number]。這是 Typescript 的一個設(shè)計限制,在 microsoft/TypeScript#43301 中有所提及。
解決函數(shù)交集類型與推斷類型不匹配問題的最佳方法是避免不必要的函數(shù)重載。如果不同的簽名實際上返回的是同一類型,或者可以合并成一個更通用的類型,則應(yīng)該避免使用重載。
例如,如果想要函數(shù)返回 { a: string } 和 { b: number } 的交集類型,正確的做法是:
function baz(): { a: string } & { b: number } { return { a: "", b: 1 } } const ab = baz(); // const ab: { a: string; } & { b: number; } type BazRet = ReturnType<typeof baz>; // type BazRet: { a: string; } & { b: number; }
而不是使用多個函數(shù)簽名:
function bar(): { a: string }; function bar(): { b: number }; function bar() { return { a: "", b: 1 } }
回到原始問題中的例子:
type Foo = (() => Promise<string>) & (() => Promise<any>) ;
這個類型表示一個函數(shù),它可以返回 Promise<string> 或 Promise<any>。然而,使用 any 類型通常是不推薦的,因為它會失去類型安全性。
更合適的做法是根據(jù)實際需求選擇更具體的類型。如果該函數(shù)總是返回 Promise<string>,則應(yīng)該使用 () => Promise<string>。如果需要處理更廣泛的類型,可以考慮使用泛型或更具體的聯(lián)合類型。
例如,如果該函數(shù)可能返回字符串或數(shù)字,則可以使用以下類型:
type Foo = () => Promise<string | number>;
函數(shù)類型交集在 Typescript 中可以模擬函數(shù)重載,但在類型推斷方面存在局限性。為了避免類型不匹配的問題,應(yīng)該盡量避免不必要的函數(shù)重載,并選擇更具體、更通用的類型來描述函數(shù)的行為。在使用 any 類型時要格外小心,因為它會降低代碼的類型安全性。理解 Typescript 的類型系統(tǒng),并遵循最佳實踐,可以編寫出更健壯、更可維護的代碼。
以上就是Typescript 函數(shù)交集類型與推斷類型不匹配問題詳解的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號