定义选取键的联合类型

Ren*_*ler 4 typescript

给定一个接口,例如:

interface A {
    AA : string
    AB : number
}
Run Code Online (Sandbox Code Playgroud)

我想要一个类型,它是每个可能选择的类型的联合,例如:

type B = Pick<A, "AA"> | Pick<A,"AB"> 
Run Code Online (Sandbox Code Playgroud)

或者,如果不熟悉 Pick:

type B = {AA: string} | {BB : number}
Run Code Online (Sandbox Code Playgroud)

我不想像上面那样手动写出来。我希望能够编写某种通用类型或函数来为我做这件事,例如

type B = OneOf<A>
Run Code Online (Sandbox Code Playgroud)

如何编写“OneOf”,或者打字稿中最接近的当前近似值/解决方法是什么?

CRi*_*ice 7

这样的事情怎么样:

type OneOf<T> = {[K in keyof T]: Pick<T, K>}[keyof T];
Run Code Online (Sandbox Code Playgroud)

使用该结构,您的示例将如下所示:

interface A {
    AA: string;
    AB: number;
}

declare var x: OneOf<A>;

// x now has type:
// Pick<A, "AA"> | Pick<A, "AB">
Run Code Online (Sandbox Code Playgroud)