Typescript中infer關(guān)鍵字的使用小結(jié)
infer 是 TypeScript 中條件類型的一個(gè)關(guān)鍵字,主要用于在條件類型中進(jìn)行類型推斷。它允許我們?cè)诜盒蜅l件類型中聲明一個(gè)類型變量,然后從其他類型中推斷出這個(gè)類型。
基本語(yǔ)法
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
主要使用場(chǎng)景
1.獲取函數(shù)返回類型
// 內(nèi)置的 ReturnType 實(shí)現(xiàn)原理
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function foo(): string {
return "hello";
}
type FooReturn = MyReturnType<typeof foo>; // string
2.獲取函數(shù)參數(shù)類型
// 獲取第一個(gè)參數(shù)類型
type FirstParam<T> = T extends (first: infer P, ...rest: any[]) => any ? P : never;
// 獲取所有參數(shù)類型(元組)
type Params<T> = T extends (...args: infer P) => any ? P : never;
function bar(x: number, y: string): void {}
type BarFirstParam = FirstParam<typeof bar>; // number
type BarParams = Params<typeof bar>; // [number, string]
3.獲取數(shù)組/元組元素類型
typescript
type ArrayElement<T> = T extends (infer U)[] ? U : never; type StrArrayElement = ArrayElement<string[]>; // string type NumArrayElement = ArrayElement<number[]>; // number
4.獲取 Promise 的解析類型
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T; type PromiseString = Promise<string>; type Unwrapped = UnwrapPromise<PromiseString>; // string
實(shí)際應(yīng)用示例
示例1:提取對(duì)象值類型
type ValueOf<T> = T extends { [key: string]: infer V } ? V : never;
type Obj = { a: number; b: string };
type Values = ValueOf<Obj>; // number | string
示例2:提取構(gòu)造函數(shù)實(shí)例類型
type InstanceType<T> = T extends new (...args: any[]) => infer R ? R : any;
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
}
type AnimalInstance = InstanceType<typeof Animal>; // Animal
示例3:遞歸解包嵌套 Promise
type DeepUnwrapPromise<T> = T extends Promise<infer U> ? DeepUnwrapPromise<U> : T; type NestedPromise = Promise<Promise<string>>; type Result = DeepUnwrapPromise<NestedPromise>; // string
使用注意事項(xiàng)
1.只能用在條件類型的 extends 子句中
// ? 正確 type Example1<T> = T extends Array<infer U> ? U : never; // ? 錯(cuò)誤:infer 不能單獨(dú)使用 type Example2<T> = infer U; // 編譯錯(cuò)誤
2.多個(gè) infer 可以同時(shí)使用
type Zip<T, U> = T extends [infer A, ...infer RestT]
? U extends [infer B, ...infer RestU]
? [[A, B], ...Zip<RestT, RestU>]
: []
: [];
type Result = Zip<[1, 2], ['a', 'b']>; // [[1, 'a'], [2, 'b']]
3.協(xié)變位置 vs 逆變位置
// infer 在協(xié)變位置(返回類型) type GetReturnType<T> = T extends () => infer R ? R : never; // infer 在逆變位置(參數(shù)類型) type GetArgType<T> = T extends (arg: infer A) => any ? A : never;
實(shí)戰(zhàn)技巧
1.類型守衛(wèi)與 infer
function isPromise<T>(value: any): value is Promise<T> {
return value && typeof value.then === 'function';
}
async function handle<T>(input: T | Promise<T>): Promise<T> {
if (isPromise(input)) {
// 這里 input 被推斷為 Promise<T>
return input;
}
return Promise.resolve(input);
}
2.構(gòu)建實(shí)用類型工具
// 提取所有方法的返回類型
type MethodsReturnType<T> = {
[K in keyof T]: T[K] extends (...args: any[]) => infer R ? R : never;
};
// 提取特定屬性的類型
type PropType<T, K extends keyof T> = T extends { [P in K]: infer V } ? V : never;
總結(jié)
infer 的核心作用:在條件類型中提取未知類型的內(nèi)部結(jié)構(gòu)。它是 TypeScript 類型系統(tǒng)的高級(jí)特性,常用于:
- 類型提取:從已有類型中提取部分類型信息
- 類型轉(zhuǎn)換:將一個(gè)類型轉(zhuǎn)換為另一種形式
- 類型推導(dǎo):根據(jù)上下文推導(dǎo)出具體類型
- 工具類型創(chuàng)建:構(gòu)建復(fù)雜的實(shí)用類型工具
掌握 infer 的關(guān)鍵是多實(shí)踐,從簡(jiǎn)單的函數(shù)返回類型提取開(kāi)始,逐步應(yīng)用到更復(fù)雜的類型操作中。
到此這篇關(guān)于Typescript中infer關(guān)鍵字的使用小結(jié)的文章就介紹到這了,更多相關(guān)Typescript infer關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js選取多個(gè)或單個(gè)元素的實(shí)現(xiàn)代碼(用class)
js選取多個(gè)或單個(gè)元素的實(shí)現(xiàn)代碼(用class),需要的朋友可以參考下2012-08-08
JavaScript數(shù)組及常見(jiàn)操作方法小結(jié)
這篇文章主要介紹了JavaScript數(shù)組及常見(jiàn)操作方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript數(shù)組的基本獲取、添加、刪除、排序、翻轉(zhuǎn)等相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
深入理解JS中的微任務(wù)和宏任務(wù)的執(zhí)行順序及應(yīng)用場(chǎng)景
JavaScript中的任務(wù)分為宏任務(wù)和微任務(wù),它們的執(zhí)行順序會(huì)影響代碼的執(zhí)行結(jié)果。了解它們的機(jī)制可以幫助我們更好地理解事件循環(huán)和異步編程,避免出現(xiàn)一些意想不到的錯(cuò)誤2023-05-05
JavaScript中字符串、數(shù)組和對(duì)象截取數(shù)據(jù)方法總結(jié)大全
這篇文章主要介紹了JavaScript中字符串、數(shù)組和對(duì)象截取數(shù)據(jù)方法的相關(guān)資料,需要的朋友可以參考下2025-05-05
微信小程序?qū)崿F(xiàn)自上而下字幕滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)自上而下字幕滾動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
JavaScript中的單引號(hào)和雙引號(hào)報(bào)錯(cuò)的解決方法
數(shù)據(jù)中夾雜單引號(hào)(')或者雙引號(hào)("),這種語(yǔ)句往往會(huì)造成JavaScript報(bào)錯(cuò)。對(duì)此一般采用/'或者/"的解決2014-09-09
js實(shí)現(xiàn)的簡(jiǎn)潔網(wǎng)頁(yè)滑動(dòng)tab菜單效果代碼
這篇文章主要介紹了js實(shí)現(xiàn)的簡(jiǎn)潔網(wǎng)頁(yè)滑動(dòng)tab菜單效果代碼,可實(shí)現(xiàn)簡(jiǎn)單的鼠標(biāo)滑過(guò)tab標(biāo)簽切換的功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-08-08

