为什么这段以函数为键的对象定义代码在TypeScript中无法编译?
为什么这段以函数为键的对象定义代码在TypeScript中无法编译?
先来看你提到的JavaScript代码,它确实能正常运行:
const object = { key: 1, "key key": 2, 3: 3, [() => undefined]: 4, }; console.log(Object.keys(object));
在JavaScript里,对象的键最终都会被转换为字符串类型——哪怕你用函数当键,运行时也会把这个函数的toString()结果作为实际的键名。
但到了TypeScript里,这段代码就会报错,错误信息是:
A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
这是因为TypeScript作为静态类型语言,会在编译阶段就对类型做严格检查。它明确规定了对象的计算属性名必须是string、number、symbol或者any类型,而你这里用的是一个函数(类型为() => undefined),不符合TS的类型约束。
虽然JavaScript运行时会自动把函数转成字符串,但TS不会等到运行时再处理——它在编译时就会拦截这种“类型不符合预期”的写法,目的是提前避免潜在的类型问题,保证代码的类型安全性。如果你确实想用类似的写法,可以手动把函数转成字符串,比如写成[(() => undefined).toString()]: 4,这样TS就会认可这个键的类型是string,编译就能通过了。
备注:内容来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

