从字符串文字类型创建新的键值类型
Create new key value type from string literals types
我正在寻找一种方法来根据字符串文字类型的值创建新的对象类型。我想提取每个字符串文字值并将其用作新创建类型中的键。到目前为止,我陷入了这样的解决方案:
export type ExtractRouteParams<T> = string extends T
? Record<string, string>
: { [k in T] : string | number }
type P = ExtractRouteParams<'Id1' | 'Id2'>
它符合我的预期。 P 具有以下类型
type P = {
Id1: string | number;
Id2: string | number;
}
但不幸的是它抛出了一个错误
Type 'T' is not assignable to type 'string | number | symbol'.
Type 'T' is not assignable to type 'symbol'.
解决方案是基于playground
使用内置 PropertyKey
类型作为 T
的通用约束:
// v-----------------v add here
export type ExtractRouteParams<T extends PropertyKey> = string extends T
? Record<string, string>
: { [k in T] : string | number }
type P = ExtractRouteParams<'Id1' | 'Id2'>
注意:PropertyKey
只是 string | number | symbol
的别名。
我正在寻找一种方法来根据字符串文字类型的值创建新的对象类型。我想提取每个字符串文字值并将其用作新创建类型中的键。到目前为止,我陷入了这样的解决方案:
export type ExtractRouteParams<T> = string extends T
? Record<string, string>
: { [k in T] : string | number }
type P = ExtractRouteParams<'Id1' | 'Id2'>
它符合我的预期。 P 具有以下类型
type P = {
Id1: string | number;
Id2: string | number;
}
但不幸的是它抛出了一个错误
Type 'T' is not assignable to type 'string | number | symbol'. Type 'T' is not assignable to type 'symbol'.
解决方案是基于playground
使用内置 PropertyKey
类型作为 T
的通用约束:
// v-----------------v add here
export type ExtractRouteParams<T extends PropertyKey> = string extends T
? Record<string, string>
: { [k in T] : string | number }
type P = ExtractRouteParams<'Id1' | 'Id2'>
注意:PropertyKey
只是 string | number | symbol
的别名。