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 }
。 它与我要搜索的类型不同 。如果不是那么困难,我只想得到一个线索;)
答案 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