从字符串文字类型创建新的键值类型



我正在寻找一种基于字符串文字类型的值创建新对象类型的方法。我想提取每个字符串文字值,并将其用作新建类型中的键。到目前为止,我被困在这样的解决方案中:

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;
}

但不幸的是,它抛出了一个错误

类型"T"不可分配给类型"string | number | symbol"。类型"T"不可分配给类型"symbol"。

解决方案基于操场

使用内置的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的别名。

代码示例

最新更新