You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:06:22