如何从字符串值对象推导TypeScript的ClientOpts类型?
用字符串类型名称对象推导TypeScript接口的方案
当然可以!你完全不用依赖示例值对象的typeof方式,仅靠包含类型名称字符串的validConstructorOptions就能推导出目标ClientOpts类型,核心是利用TypeScript的映射类型和条件类型来完成字符串到实际类型的转换。
具体实现步骤
- 定义字符串类型名到TS类型的映射
首先我们需要一个辅助类型,把'string'、'number'这类字符串转换成TypeScript对应的内置类型:
// 把字符串类型名映射为实际TS类型的辅助类型 type TypeNameToType<T extends string> = T extends 'string' ? string : T extends 'number' ? number : T extends 'Function' ? Function : // 可以根据需要扩展更多类型,比如boolean、object等 never;
- 通过映射类型推导目标接口
接下来遍历validConstructorOptions的所有键,把每个键对应的字符串类型名转换成实际类型:
// 你的原始字符串类型名称对象 export const validConstructorOptions = { key: 'string', listener: 'Function', host: 'string', port: 'number', unlockRequestTimeout: 'number', lockRequestTimeout: 'number', unlockRetryMax: 'number', lockRetryMax: 'number' }; // 推导得到的ClientOpts类型 export type ClientOpts = { [K in keyof typeof validConstructorOptions]: TypeNameToType<typeof validConstructorOptions[K]> };
推导结果验证
这样生成的ClientOpts类型完全等价于你最初手动定义的接口:
// 推导后的ClientOpts等价于: interface ClientOpts { key: string; listener: Function; host: string; port: number; unlockRequestTimeout: number; lockRequestTimeout: number; unlockRetryMax: number; lockRetryMax: number; }
扩展说明
如果后续需要支持更多类型(比如boolean、object),只需要在TypeNameToType中添加对应的条件分支即可,例如:
type TypeNameToType<T extends string> = T extends 'string' ? string : T extends 'number' ? number : T extends 'Function' ? Function : T extends 'boolean' ? boolean : T extends 'object' ? object : never;
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

