如何从映射类型中推断泛型参数?
从模板字面量映射键中推断泛型参数并关联值类型
我需要用模板字面量类型作为映射类型的键,目标是从update-${SaveKey}格式的键里推断出SaveKey,并把它传入SaveValue<>作为值类型的参数。核心代码的疑问点如下:
type EventsMap = { // 如何从`update-${SaveKey}`中推断SaveKey并传入SaveValue<>? [K in `update-${SaveKey}`]: (newValue: SaveValue<SaveKey>) => void }
解决方案
方案1:基于预定义键的键重映射
如果已经明确所有可能的SaveKey类型,可以用TypeScript的映射类型键重映射(as关键字)来实现:
// 预定义所有可能的SaveKey type SaveKey = 'user' | 'settings' | 'theme'; // 示例SaveValue类型,根据不同SaveKey返回对应类型 type SaveValue<K extends SaveKey> = K extends 'user' ? { name: string } : K extends 'settings' ? { darkMode: boolean } : { color: string }; // 构造EventsMap:遍历SaveKey生成模板字面量键,同时关联对应值类型 type EventsMap = { [K in SaveKey as `update-${K}`]: (newValue: SaveValue<K>) => void };
这里通过as把每个SaveKey成员转换成update-${K}格式的键,同时直接复用K作为SaveValue的参数,完美实现键和值类型的关联。
方案2:通用的模板字面量推断
如果需要支持任意update-*格式的键,不需要预定义SaveKey,可以用条件类型+infer关键字来动态推断:
// 示例SaveValue类型,这里假设SaveKey是字符串类型 type SaveValue<K extends string> = K extends 'user' ? { name: string } : K extends 'settings' ? { darkMode: boolean } : { [key: string]: any }; // 通用事件映射类型,自动从键中推断SaveKey type GenericEventsMap<K extends `update-${string}`> = { [Key in K]: Key extends `update-${infer SaveKey}` ? (newValue: SaveValue<SaveKey>) : never }; // 使用示例 type MyEvents = GenericEventsMap<'update-user' | 'update-settings' | 'update-theme'>;
这个方案会自动从每个符合update-${string}的键里提取出SaveKey部分,再传入SaveValue生成对应的值类型。
内容的提问来源于stack exchange,提问作者yaforsh
相关产品推荐
相关产品推荐

