Typescript

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

type 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、问题:

Typescript_第1张图片

解释:

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

NonNullable1 中,条件类型 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 extends any ? Type[] : never;
type vvv = ToArray //  type vvv = string[] | number[]

注意:

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

type ToArray = [Type] extends [any] ? Type[] : never;
type vvv = ToArray //  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 extends Array ? u : never;
type nn = yy//never
type nn2 = yy<[string]>//string

 

你可能感兴趣的:(typeScript,typescript)