返回

TypeScript 类型体操:数组变形之道

前端

作为 TypeScript 类型体操系列的第三篇文章,我们将深入探究数组变形。通过剖析 7 个具体的元组相关工具类型,我们将揭开类型编程的奥秘,解锁数组操纵的强大力量。

元组变形七巧板

1. Push:添加元素到元组末尾

Push<T, U> 将类型 U 添加到元组 T 的末尾,形成一个新的元组。例如:

type NewTuple = Push<[1, 2], 3>; // [1, 2, 3]

2. Len:获取元组长度

Len<T> 返回元组 T 的长度。例如:

type TupleLength = Len<[1, 2, 3]>; // 3

3. TupleToObject:将元组转换为对象

TupleToObject<T> 将元组 T 转换为一个对象,其中元组中的每个元素作为对象的键,值为元组的索引。例如:

type TupleObj = TupleToObject<[1, 2, 3]>;
// { 0: 1, 1: 2, 2: 3 }

4. Unshift:在元组开头添加元素

Unshift<T, U>Push 相反,它将类型 U 添加到元组 T 的开头,形成一个新的元组。例如:

type NewTuple = Unshift<[1, 2], 0>; // [0, 1, 2]

5. Concat:连接两个元组

Concat<T, U> 将元组 TU 连接成一个新的元组。例如:

type NewTuple = Concat<[1, 2], [3, 4]>; // [1, 2, 3, 4]

6. First:获取元组第一个元素

First<T> 返回元组 T 的第一个元素。例如:

type FirstElement = First<[1, 2, 3]>; // 1

7. Last:获取元组最后一个元素

Last<T> 返回元组 T 的最后一个元素。例如:

type LastElement = Last<[1, 2, 3]>; // 3

用例:探索类型体操的魅力

这些工具类型不仅功能强大,而且用途广泛。我们来看几个具体的用例:

1. 动态参数验证:

type Func<T extends unknown[]> = (...args: T) => void;

type ValidatedFunc<T extends unknown[]> =
  Func<TupleToObject<T>>;

const fn: ValidatedFunc<[string, number]> = (name, age) => {
  // ...
};

2. 类型安全数据转换:

type User = [string, number];

const users: User[] = [['Alice', 25], ['Bob', 30]];

// 转换为具有命名属性的对象数组
const userObjects: { name: string; age: number }[] = users.map(
  (user) => TupleToObject(user)
);

3. 类型别名复用:

type RGB = [number, number, number];

type ColorPicker = Record<string, RGB>;

const colors: ColorPicker = {
  red: [255, 0, 0],
  blue: [0, 0, 255],
};