TypeScript:将联合类型映射到另一个联合类型

bin*_*les 6 discriminated-union typescript

是否可以在TypeScript中将联合类型映射到另一个联合类型?

我希望能做什么

例如给定一个联合类型A:

type A = 'one' | 'two' | 'three';
Run Code Online (Sandbox Code Playgroud)

我希望能够将它映射到联合类型B:

type B = { type: 'one' } | { type: 'two'} | { type: 'three' };
Run Code Online (Sandbox Code Playgroud)

我试过了什么

type B = { type: A };
Run Code Online (Sandbox Code Playgroud)

但这会导致:

type B = { type: 'one' | 'two' | 'three' };
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

art*_*tem 12

您可以使用条件类型来分配联合类型的成员(条件类型总是只占用一个分支,仅用于其分配属性,我从这个答案中学到了这个方法)

type A = 'one' | 'two' | 'three';

type Distribute<U> = U extends any ? {type: U} : never;

type B = Distribute<A>;

/*
type B = {
    type: "one";
} | {
    type: "two";
} | {
    type: "three";
}
*/
Run Code Online (Sandbox Code Playgroud)

  • 好的,这完成了工作:`type PickFieldTypes&lt;U, K extends keyof U&gt; = U extends any ? U[K]:从不;`。伟大的!! (2认同)