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
相关产品推荐
相关产品推荐

