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

TypeScript模板字面量类型示例中string & keyof Type语法疑问

为什么on<Key extends string & keyof Type>需要string &?

这个问题的核心在于**keyof Type返回的类型不一定全是字符串**——TypeScript里对象的属性名除了string,还可以是number或symbol类型。比如:

const obj = {
  name: 'Alice',
  2024: 'year',
  [Symbol('id')]: 123
}
type ObjKeys = keyof typeof obj; // 类型是 "name" | 2024 | typeof Symbol('id')

回到文档里的示例,on方法是用模板字面量生成event:${Key}形式的事件名,而模板字面量要求拼接的类型必须是可转换为字符串的string类型(number/symbol虽然在运行时会转成字符串,但类型层面会有兼容性问题)。

string & keyof Type的作用就是从keyof Type里筛选出仅属于string类型的属性名,把number、symbol类型的属性排除在外,确保后续模板字面量的类型操作完全合法。

如果去掉string &,当Type包含number或symbol类型的属性时,Key就可能是这些非string类型,TypeScript会认为${Key}无法安全地和"event:"拼接成合法的字符串字面量类型,因此抛出错误。

举个具体的反例:

type User = {
  age: number;
  100: string; // number类型的属性名
}
// 如果写成on<Key extends keyof User>,Key可以是100(number类型)
// 此时`event:${Key}`的类型会是`"event:100"`,但类型检查时会因为Key不是string而报错

所以string &是为了严格限制Key只能是string类型的属性名,保证模板字面量类型推断的正确性。

内容的提问来源于stack exchange,提问作者Brian Hong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:34:56