计算所有置换元组的并集实际上比将并集转换为单个元组简单一点。递归映射类型的条件是在空对象上返回
我想创建一个泛型类型,比如
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>;
请注意,这种类型允许重复数组中的键。