类似于记录但创建联合类型的打字稿类型

时间:2019-12-05 09:43:00

标签: typescript

我想为以下代码创建类型别名:

type Foo = {alpha: string} | {beta: string}

我想创建一个按如下方式创建的类型,其中我将上面的类型定义为Foo<'alpha' | 'beta', string>

type Foo<K, T> = ...

由于以下情况为真,因此不能选择“记录”:

Record<'alpha' | 'beta', string> === {
    alpha: string;
    beta: string;
}

1 个答案:

答案 0 :(得分:2)

解决方案是使用mapped types。考虑下面的代码:

type GenericFoo<KeyT extends PropertyKey, ValueT> = {
  [Key in KeyT]: { [Key2 in Key]: ValueT }
}[KeyT];

type Foo = GenericFoo<'alpha' | 'beta', string>

Foo被评估为联合:

type Foo = {
    alpha: string;
} | {
    beta: string;
}

一些解释:

  • GenericFoo创建一个映射类型,其值表示所有{key,value}
  • [KeyT]定义的末尾
  • GenericFoo意味着我们采用了映射类型的所有值类型,这意味着我们获得了所有{key,value}对的并集。