-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
Description
题目
题目链接:TupleToUnion
实现 TupleToUnion
,返回数组的所有项的联合类型。
import type { Equal, Expect } from "@type-challenges/utils";
type cases = [
Expect<Equal<TupleToUnion<[123, "456", true]>, 123 | "456" | true>>,
Expect<Equal<TupleToUnion<[123]>, 123>>
];
答案
方法一
type TupleToUnion<T extends unknown[]> = T[number];
// 等价于
type TupleToUnion<T> = T extends unknown[] ? T[number] : never;
知识点
T[number]
得到数组所有成员的联合类型
方法二
type TupleToUnion<T> = T[number & keyof T];
// 等价于
type TupleToUnion<T> = T[Extract<keyof T, number>];
知识点
keyof T
,T
是数组keyof T
的结果是索引的联合类型number & keyof T
,筛选出keyof T
中的number
类型
TIP
Extract<keyof T, number>
= number & keyof T
方法三
type TupleToUnion<T> = T extends Array<infer R> ? R : never;
// 等价于
type TupleToUnion<T> = T extends (infer R)[] ? R : never;
知识点
将数组的中的内容声明为 R
方法四
type TupleToUnion<T> = T extends [infer first, ...infer rest]
? first | TupleToUnion<rest>
: never;
知识点
- 将数组的第一项声明为
first
,剩余项声明为rest
- 如果数组始终有剩余项,将会递归调用
TupleToUnion
方法五
type TupleToUnion<T> = T[any];
知识点
any
可以作为索引类型
方法六
type TupleToUnion<T extends any[]> = keyof {
[K in T[number]]: K;
};
知识点
将数组变成对象,数组的项作为对象的 key
,使用 keyof
就能得到数组所有项的联合类型。