亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > web前端 > js教程 > 正文

Typescript 函數(shù)交集類型與推斷類型不匹配問題詳解

DDD
發(fā)布: 2025-10-17 12:55:12
原創(chuàng)
367人瀏覽過

 Typescript 函數(shù)交集類型與推斷類型不匹配問題詳解

<p>本文旨在解決 Typescript 中函數(shù)交集類型與推斷類型不匹配的問題。通過分析問題產(chǎn)生的根本原因,即函數(shù)重載的特性,并結(jié)合 Typescript 的類型推斷機制,深入探討了如何避免此類問題,并提供了使用單一函數(shù)簽名替代方案的最佳實踐,以確保類型安全和代碼可維護性。</p> 在 Typescript 中,函數(shù)類型交集可能導(dǎo)致推斷類型與實際行為不一致,尤其是在涉及函數(shù)重載時。了解其背后的機制以及規(guī)避方法至關(guān)重要。 ### 函數(shù)類型交集與函數(shù)重載 在 Typescript 中,使用 `&` 符號可以將多個函數(shù)類型組合成一個交集類型。從概念上講,這類似于函數(shù)重載,即同一個函數(shù)名可以有多個不同的簽名。 例如: ```typescript type Foo = (() => Promise<string>) & (() => Promise<any>) ;

foo 類型表示一個函數(shù),它既可以返回 promise<string>,也可以返回 promise<any>。這等價于以下函數(shù)重載聲明:

function foo(): Promise<string>;
function foo(): Promise<any>;
登錄后復(fù)制

調(diào)用重載函數(shù)時的類型解析

當調(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
登錄后復(fù)制

在上面的例子中,foo("abc") 調(diào)用會匹配第一個簽名,因此 n 的類型被推斷為 number。foo(123) 調(diào)用會匹配第二個簽名,因此 s 的類型被推斷為 string。

類型推斷與函數(shù)重載的局限性

當嘗試從重載函數(shù)類型中進行類型推斷時,Typescript 編譯器通常只會從最后一個簽名進行推斷。這在某些情況下可能會導(dǎo)致意外的結(jié)果。

例如:

type FooRet = ReturnType<typeof foo>
// type FooRet = string
// ^^^^^^^^^^^^^^^^^^^^ not (string & number) or [string, number]
登錄后復(fù)制

ReturnType<typeof foo> 會推斷出 string 類型,而不是 string & number 或 [string, number]。這是 Typescript 的一個設(shè)計限制,在 microsoft/TypeScript#43301 中有所提及。

解決方案:避免不必要的函數(shù)重載

解決函數(shù)交集類型與推斷類型不匹配問題的最佳方法是避免不必要的函數(shù)重載。如果不同的簽名實際上返回的是同一類型,或者可以合并成一個更通用的類型,則應(yīng)該避免使用重載。

例如,如果想要函數(shù)返回 { a: string } 和 { b: number } 的交集類型,正確的做法是:

文心大模型
文心大模型

百度飛槳-文心大模型 ERNIE 3.0 文本理解與創(chuàng)作

文心大模型56
查看詳情 文心大模型
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; }
登錄后復(fù)制

而不是使用多個函數(shù)簽名:

function bar(): { a: string };
function bar(): { b: number };
function bar() {
    return { a: "", b: 1 }
}
登錄后復(fù)制

示例分析與改進

回到原始問題中的例子:

type Foo =  (() => Promise<string>) & (() => Promise<any>) ;
登錄后復(fù)制

這個類型表示一個函數(shù),它可以返回 Promise<string> 或 Promise<any>。然而,使用 any 類型通常是不推薦的,因為它會失去類型安全性。

更合適的做法是根據(jù)實際需求選擇更具體的類型。如果該函數(shù)總是返回 Promise<string>,則應(yīng)該使用 () => Promise<string>。如果需要處理更廣泛的類型,可以考慮使用泛型或更具體的聯(lián)合類型。

例如,如果該函數(shù)可能返回字符串或數(shù)字,則可以使用以下類型:

type Foo = () => Promise<string | number>;
登錄后復(fù)制

總結(jié)

函數(shù)類型交集在 Typescript 中可以模擬函數(shù)重載,但在類型推斷方面存在局限性。為了避免類型不匹配的問題,應(yīng)該盡量避免不必要的函數(shù)重載,并選擇更具體、更通用的類型來描述函數(shù)的行為。在使用 any 類型時要格外小心,因為它會降低代碼的類型安全性。理解 Typescript 的類型系統(tǒng),并遵循最佳實踐,可以編寫出更健壯、更可維護的代碼。

登錄后復(fù)制

以上就是Typescript 函數(shù)交集類型與推斷類型不匹配問題詳解的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學習者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號