Skip to content

14. TupleToUnion #20

@astak16

Description

@astak16

题目

题目链接: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 TT 是数组 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 就能得到数组所有项的联合类型。

参考文章

  1. TypeScript: How to get types from arrays

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions