为何函数返回的对象键无法推断值类型?TypeScript技术疑问
TypeScript计算属性键为函数调用时的类型推断问题
这确实是TypeScript的预期行为。
TypeScript在处理对象字面量的计算属性键时,对于直接嵌入的函数调用表达式(比如示例中的[getB()]),不会对函数返回值进行常量折叠以提取其字面量类型,而是将该键视为更宽泛的类型——哪怕函数明确返回的是字面量'b'。
对比三种写法的差异:
- 用字符串字面量
['b']作为键时,TypeScript直接识别出键的类型是'b',能精准匹配type A中对应的属性,因此可以自动推断出回调参数arg的类型为string。 - 将函数返回值赋值给变量
key后,TypeScript会对这个变量进行类型窄化,保留其字面量类型'b',后续用[key]作为属性键时,自然能关联到A中的b属性,完成类型推断。 - 直接使用
[getB()]作为计算键时,TypeScript在这个上下文里不会解析函数返回值的具体字面量类型,也就无法关联到A的对应属性,导致回调参数arg的类型隐式为any。
如果想在这种场景下实现类型推断,最直接的方式就是像示例中的c那样,先把函数返回值赋值给一个变量,再用变量作为计算属性键;或者也可以显式为计算键指定类型,比如:
const a = { [getB() as 'b']: (arg) => { console.log(arg); }, } as A;
内容的提问来源于stack exchange,提问作者dikobrazik
相关产品推荐
相关产品推荐

