如何定义无需数组参数的TypeScript对象泛型?
如何改写TypeScript泛型,使其支持直接传入多个字符串字面量参数
当然可以,你只需要利用TypeScript 4.0及以上版本支持的可变泛型参数(剩余参数语法),改写后的泛型可以直接接受多个字符串字面量作为参数,无需包裹成数组类型。
改写后的泛型定义
// 支持1个或多个字符串字面量参数 type Params<T extends string, ...Rest extends string[]> = Record<T | Rest[number], string>;
如果需要支持0个参数(生成空对象类型),可以给第一个参数设置默认值:
// 支持0个或多个字符串字面量参数 type Params<T extends string = never, ...Rest extends string[]> = Record<T | Rest[number], string>;
使用示例
// 单个参数场景 const singleParam: Params<'param1'> = { param1: 'hello' }; // 多个参数场景 const multiParams: Params<'param1', 'param2', 'param3'> = { param1: 'value1', param2: 'value2', param3: 'value3' }; // 0个参数场景(仅当泛型有默认值时可用) const emptyParams: Params<> = {};
原理说明
原来的泛型通过Record<T[number], string>提取数组类型T的元素联合类型;改写后的泛型:
- 用
T extends string定义第一个必填的字符串参数 - 用
...Rest extends string[]接收后续任意数量的字符串参数 - 通过
T | Rest[number]将所有传入的字符串字面量合并成一个联合类型 - 最后用
Record生成以该联合类型为键、string为值的对象类型
内容的提问来源于stack exchange,提问作者Siraj Kakeh
相关产品推荐
相关产品推荐

