Skip to content

Latest commit

 

History

History
49 lines (40 loc) · 1.7 KB

PermutationsOfTuple.md

File metadata and controls

49 lines (40 loc) · 1.7 KB
标题 标签
PermutationsOfTuple(排列元组) extends,infer(继承,推断)

排列元组。

  • 创建第二个参数 A 用来存储结果,默认是空数组。
  • 使用 infer 从数组第一项开始推断,然后将第一项和剩余项递归展开合并并和剩余项 R 联合,如果 R 为空数组则和 never 联合,否则继续递归数组剩余项,否则返回空数组。

代码如下:

type PermutationsOfTuple<
  T extends unknown[],
  A extends unknown[] = []
> = T extends [infer F, ...infer R]
  ?
      | [F, ...PermutationsOfTuple<[...R, ...A]>]
      | (R extends [] ? never : PermutationsOfTuple<R, [...A, F]>)
  : [];

使用方式:

type PermutationsOfTupleRes1 = PermutationsOfTuple<[]>; // []
type PermutationsOfTupleRes2 = PermutationsOfTuple<[any]>; // [any]
type PermutationsOfTupleRes3 = PermutationsOfTuple<[any, unknown]>; // [any, unknown] | [unknown, any]
type PermutationsOfTupleRes4 = PermutationsOfTuple<[any, unknown, never]>;
//   [any, unknown, never]
//   | [unknown, any, never]
//   | [unknown, never, any]
//   | [any, never, unknown]
//   | [never, any, unknown]
//   | [never, unknown, any]
type PermutationsOfTupleRes5 = PermutationsOfTuple<[1, number, unknown]>;
//   [1, number, unknown]
//     | [1, unknown, number]
//     | [number, 1, unknown]
//     | [unknown, 1, number]
//     | [number, unknown, 1]
//     | [unknown, number, 1]

应用场景

如下所示,鼠标悬浮到对应的类型变量可以查看类型。