是否可以使用 TypeScript 中的映射类型创建可区分联合?

Won*_*Hau 4 typescript

假设我有以下界面X

type X = {
  red: number, 
  blue: string
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用映射类型构造联合类型Y?如果不是,是否可以用其他类型的类型级机制来构造它?

type Y = {
  kind: "red"
  payload: number
} | {
 kind: "blue"
 payload: string
}
Run Code Online (Sandbox Code Playgroud)

kay*_*ya3 7

是的,您可以利用 的T[keyof T]值的并集这一事实T,无论T是什么。您可以使用映射类型来构造一个类型,其值是您想要的联合的分支:

type Y = { [K in keyof X]: {kind: K, payload: X[K]} }[keyof X]
Run Code Online (Sandbox Code Playgroud)

游乐场链接