我想为以下代码创建类型别名:
type Foo = {alpha: string} | {beta: string}
我想创建一个按如下方式创建的类型,其中我将上面的类型定义为Foo<'alpha' | 'beta', string>
type Foo<K, T> = ...
由于以下情况为真,因此不能选择“记录”:
Record<'alpha' | 'beta', string> === {
alpha: string;
beta: string;
}
答案 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}
对的并集。