TypeScript泛型对象keyof映射报错,如何忽略Symbol类型键
解决TypeScript泛型中Symbol键导致模板字符串映射报错的问题
问题核心是泛型T可能包含Symbol类型的键,而模板字符串my${key}仅支持字符串类型的键进行拼接,Symbol无法参与该操作,因此触发报错。你之前实现的OnlyStringKeys工具类型只是将非字符串键的属性值设为never,但并未排除这些键本身,所以映射时依然会处理它们,无法解决根本问题。
直接过滤非字符串键的解决方案
在映射类型的as子句中添加条件判断,仅保留字符串类型的键;对非字符串键返回never,这样这些键会被自动排除在最终生成的类型之外:
type MyAnimals = { name: "dog", fleas: 2 } function GetKeys<T extends MyAnimals>(animal: T) { type prefixedAnimal = { [key in keyof T as key extends string ? `my${key}` : never]: T[key] } } // 针对MyAnimals的直接定义写法 type prefixedAnimal = { [key in keyof MyAnimals as key extends string ? `my${key}` : never]: MyAnimals[key] }
封装通用工具类型(可选)
如果需要多次复用前缀拼接逻辑,可以封装成通用工具类型:
type PrefixStringKeys<T, Prefix extends string> = { [key in keyof T as key extends string ? `${Prefix}${key}` : never]: T[key] } // 使用示例 type prefixedAnimal = PrefixStringKeys<MyAnimals, "my">
内容的提问来源于stack exchange,提问作者Slava Knyazev
相关产品推荐
相关产品推荐

