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

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 的别名。

Code example