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
),否则保留。最终,将联合类型中不包含null
或undefined
的部分保留下来,这就是为什么NonNullableMyType
被推断为 "string"。对于条件类型
a
和b
,在 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
?