获取类型的所有组合

时间:2019-07-03 20:44:57

标签: typescript

type base = { a: number; b: string }

type all_combinations<T> = .... // *missing*

type result = all_combinations<base>

// result = {} | {a:number} | {b:string} |  { a: number; b: string }

我能做到吗?怎么样?


  • 我不是在寻找这样的解决方案:{ a?: number; b?: string } 它与我要搜索的类型不同

如果不是那么困难,我只想得到一个线索;)

2 个答案:

答案 0 :(得分:1)

解决任何问题的多种方法之一就是做到这一点...

type Base = { a: number; b: string; c: number }

type Combinations<T> = {
    [K in keyof T]: Combinations<Omit<T, K>> | Pick<T, K>
}[keyof T]

type TestCombinatinos = Combinations<Base> | Base | {}
// should be what you want give it a whirl and let me know.

另一种方法是这样做,这是每个按键更多的手动操作

export type XOR<T, U> = (T | U) extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
export type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };

type AWithoutBBWithoutA = XOR<Omit<Base, "a">, Omit<Base, "b">>;

type Base = { a: number; b: string;}
const test: AWithoutBBWithoutA ={
    a: 5
} // fine

const test1: AWithoutBBWithoutA ={
    b: "fine"
} // fine


const test2: AWithoutBBWithoutA  = {
    a: 5,
    b: "asd"
} // error

让我知道这是否符合您的需求。

编辑:我认为最好的解决方案绝对是首选;另外,作为编辑,我想补充一点,OP不需要置换算法来解决这个问题; {a:数字,b:字符串} ==== {b:字符串,a:数字}对象键顺序无关紧要;

答案 1 :(得分:0)

认为正在寻找:

type all_combinations<T> = { [P in keyof T]?: T[P]; };

通常将其称为Partial