最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Typescript中infer關(guān)鍵字的使用小結(jié)

 更新時(shí)間:2026年01月13日 10:50:24   作者:滿天星辰  
infer是TypeScript中條件類型的一個(gè)關(guān)鍵字,主要用于在條件類型中進(jìn)行類型推斷,下面就來(lái)詳細(xì)的介紹一下Typescript infer關(guān)鍵字的使用,感興趣的可以了解一下

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í)特性,常用于:

  1. 類型提取:從已有類型中提取部分類型信息
  2. 類型轉(zhuǎn)換:將一個(gè)類型轉(zhuǎn)換為另一種形式
  3. 類型推導(dǎo):根據(jù)上下文推導(dǎo)出具體類型
  4. 工具類型創(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)文章

最新評(píng)論

福泉市| 喀喇沁旗| 保康县| 上虞市| 玉树县| 临江市| 黄石市| 崇州市| 万宁市| 綦江县| 监利县| 瑞昌市| 邳州市| 阿克苏市| 舒兰市| 南投市| 弥勒县| 平顺县| 平利县| 来宾市| 四子王旗| 辰溪县| 南汇区| 望都县| 德昌县| 江都市| 奉节县| 沈阳市| 阳西县| 阿拉善右旗| 如皋市| 昭平县| 三都| 泌阳县| 靖州| 晋江市| 龙里县| 八宿县| 娱乐| 临江市| 巴彦淖尔市|