创建一个数组类型,其中包含所提供类型的所有不同键



我想创建一个泛型类型,比如

type KeyArr<T>

将包含T的密钥排列的并集

例如:

type foo = KeyArr<{a:1, b:2}>;

应与相同

type foo = ['a', 'b'] | ['b', 'a'];

这是可以实现的吗?

计算所有置换元组的并集实际上比将并集转换为单个元组简单一点。递归映射类型的条件是在空对象上返回[]而不是never,这将完成以下任务:
type KeyArr<T> =
keyof T extends []
? []
: {[K in keyof T]: [K, ...KeyArr<Omit<T,K>>]}[keyof T]
type Foo1 = KeyArr<{}>               // []
type Foo2 = KeyArr<{a:1, b:2}>       // ["a", "b"] | ["b", "a"]
type Foo3 = KeyArr<{a:1, b:2, c: 3}> // ["a", "b", "c"] | ["a", "c", "b"] | ["b", "a", "c"] | ["b", "c", "a"] | ["c", "a", "b"] | ["c", "b", "a"]

TypeScript游乐场

不过,工会类型很快就会变得非常庞大。对于具有8个属性的对象,并集有40320个成员,TypeScript的速度明显较慢,而对于9个属性(将创建362880个并集(,它完全失败。

一般来说——是的,这是可能的。如果有一个接受对象中每个键的数组类型就足够了,那么看看下面的代码。如果你需要Tuple类型,它更复杂,看看这个线程

type KeyArr<T extends object> = Array<keyof T>
type KeyArr<T> = Array<keyof T>;

请注意,这种类型允许重复数组中的键。

相关内容

最新更新