Typescript

2024-01-07 17:51:51

1、获取数组 / 元祖 的值的联合类型 :T [number]?

type t<T> = T extends any[] ? T[number] : T;

type c = t<[number, string]>; //type c = string | number

let arr: [4, '4', true];
type s = (typeof arr)[number]; //type s = true | 4 | "4"

type arr1 = string | number[];
type b = arr1[number]; //type b = string | number

2、问题:

解释:

条件类型 T extends U ? X : Y 在判断时会考虑联合类型的分配规则。当你使用 NonNullable1<T> 来处理 MyType 时,条件类型会根据联合类型的分配规则来进行判断。

NonNullable1<T> 中,条件类型 T extends null | undefined ? never : T 会首先拆解 T 的联合类型。对于每个成员 X,它会检查是否满足 X extends null | undefined,如果满足,则将其排除掉(使用 never),否则保留。最终,将联合类型中不包含 nullundefined 的部分保留下来,这就是为什么 NonNullableMyType 被推断为 "string"。

对于条件类型 ab,在 TypeScript 中,条件类型的判断是基于联合类型的分配规则。因此,即使 MyType 不是 null | undefined 的子类型,条件类型的判断依然会按照联合类型的规则来进行。

?

官网解释:TypeScript: Documentation - Conditional Types?


type ToArray<Type> = Type extends any ? Type[] : never;
type vvv = ToArray<string | number> //  type vvv = string[] | number[]

注意:

默认情况 分配性是期望的行为。为了避免这种行为,可以将extends关键字的两边用方括号括起来。?

type ToArray<Type> = [Type] extends [any] ? Type[] : never;
type vvv = ToArray<string | number> //  type vvv = (string | number)[]

3、

在 TypeScript 中,条件类型 T extends U ? X : Y 的判断方式是基于联合类型的分配律

type b = null | undefined extends string | null | undefined ? true : false;?

被解析为?true,这是因为 TypeScript 在判断条件类型时,会将联合类型进行分配。当条件为?

null | undefined extends string | null | undefined?

时,相当于?

(null extends string | null | undefined) | (undefined extends string | null | undefined)

由于?null?和?undefined?都是?string | null | undefined?的子类型,所以条件判断为?true

4、 infer 代替 T[number]

条件类型"extends" 子句中才允许 "infer" 声明。?

infer 关键字通常与条件类型一起使用,用于推断类型变量。它允许我们在泛型条件类型中引入新的类型变量,并从输入类型中提取信息以创建一个新类型。通过使用 infer 关键字,我们可以在 TypeScript 中更灵活地操作和推断类型。


type yy<T> = T extends Array<infer u> ? u : never;
type nn = yy<string>//never
type nn2 = yy<[string]>//string

?

文章来源:https://blog.csdn.net/gu2022_3_5_21_23/article/details/135437809
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。