type A = 1; type B = 1 | 2; typeResult = A extends B ? true : false; // true
if(A <= B) and (C <= D)
1 2 3 4 5 6 7 8 9 10 11
type A = 1; type B = 1 | 2; type C = 3; type D = 3 | 4; typeResult = A extends B ? C extends D ? 'true, true' : 'true, false' : C extends D ? 'false, true' : 'false, false'; // "true, true"
空元组
1 2 3 4 5
type A = []; typeIsEmptyArray<Arrextendsunknown[]> = Arr['length'] extends0 ? true : false; typeResult = IsEmptyArray<A>; // true
元组与数组的区别是:数组长度没有限制,而元组长度有限制;
可以理解为:元组就是长度固定的数组
非空元组
1 2 3 4 5
type A = [1]; typeNotEmpty<Arrextendsunknown[]> = Arrextends [...infer X, infer Last] ? true : false; typeResult = NotEmpty<A>; // true
type B = [1, 2]; type C = [3, 4]; type D = [...B, ...C]; // [1, 2, 3, 4]
[1, 2, 3, 4] => 4
1 2 3 4 5
type D = [1, 2, 3, 4]; // 注意 1,2,3,4 都是类型,不是值 typeLast<T> = T extends [...items: unknown[], last: infer X] ? X : never; type E = Last<D>; // ^--- E = 4 注意这里的 4 是类型,不是值
这里顺便提一下错误的写法
1 2 3 4 5
type D = [1, 2, 3, 4]; // 注意 1,2,3,4 都是类型,不是值 typeLast<T extendsunknown[]> = T[T["length"] - 1] // TS 并没有提供 - 1 操作 type E = Last<D>
[1, 2, 3, 4] => [1, 2, 3]
1 2 3 4 5
type D = [1, 2, 3, 4]; // 注意 1,2,3,4 都是类型,不是值 typeNoLast<T> = T extends [...infer X, unknown] ? X : never; type E = NoLast<D>; // ^--- E = [1,2,3] 注意是类型,不是值
字符串体操
‘a’ => ‘A’
1 2 3 4 5 6
type A = 'vivy'; type B = Capitalize<A>; // ^-- type B = "Vivy" type C = 'Ich' | '☆' | 'liebe' | '☆' | 'dich'; type X = Capitalize<C>; // ^-- type X = "Ich" | "☆" | "Liebe" | "Dich"