微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TypeScript 学习笔记五- infer

infer是在 typescript 2.8 中新增的关键字。

一、简单的示例

type ParamType<T> = T extends (...args: infer P) => any ? P : T;

在这个条件语句 T extends (...args: infer P) => any ? P : T中,infer P 表示待推断的函数参数。

整句表示为:如果 T 能赋值给 (...args: infer P) => any,则结果是 (...args: infer P) => any 类型中的参数 P,否则返回为 T。

二、extends

infer 关键词常在条件类型中和 extends 关键词一同出现,表示将要推断的类型,作为类型变量可以在三元表达式的 True 部分引用。

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

type func = () => number;
type variable = string;
type funcReturnType = ReturnType<func>; // funcReturnType 类型为 number
type varReturnType = ReturnType<variable>; // varReturnType 类型为 string

在这个例子中,infer R代表待推断的返回值类型,如果T是一个函数,则返回函数的返回值,否则返回any

三、解包

infer 的作用不止是推断返回值,还可以解包

type Unpacked<T> = T extends (infer R)[] ? R : T;

type Ids = number[];
type Names = string[];
type idType = Unpacked<Ids>; // idType 类型为 number
type nameType = Unpacked<Names>; // nameType 类型为string

这样就能简单获取数组里的元素类型

四、推断联合类型

type Foo<T> = T extends { a: infer U; b: infer U } ? U : never;

type T10 = Foo<{ a: string; b: string }>; // T10类型为 string
type T11 = Foo<{ a: string; b: number }>; // T11类型为 string | number

一个类型变量在推断的值有多种情况的时候会推断为联合类型,针对这个特性,很方便的可以将元组转为联合类型

type ElementOf<T> = T extends (infer R)[] ? R : never;

type TTuple = [string, number];
type Union = ElementOf<TTuple>; // Union 类型为 string | number

简单的记录一下,后面用到再深入了解。

参考链接
Type Inference
理解TypeScript中的infer关键字
深入理解 TypeScript

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐