为何给非IIFE箭头函数加括号会影响TypeScript类型检查?
为什么括号包裹箭头函数会触发TypeScript类型报错?
先看示例代码:
interface F { (): void; x: boolean; } const f: F = ()=>{}; f.x = true; // 正常运行 const g: F = (()=>{}); // ^ 报错:类型 '() => void' 中缺少属性 'x',但类型 'F' 中需要该属性。 g.x = true;
两者唯一的区别就是赋值给g的箭头函数被括号包裹了,原因在于TypeScript处理这两种写法的逻辑不一样:
对于
const f: F = ()=>{}:右边的箭头函数处于赋值目标上下文,TypeScript会先看左边的目标类型F,知道这个值需要同时是函数和拥有x属性的对象,所以会直接把箭头函数当作F类型来处理,允许后续补加x属性,不会提前报错。对于
const g: F = (()=>{}):括号把箭头函数变成了一个独立的函数表达式,TypeScript会先单独推断这个表达式的类型——它就是一个普通的() => void函数,没有额外属性。之后再把这个普通函数赋值给要求有x属性的F类型变量,自然就会触发类型不匹配的报错。
说白了,括号改变了TypeScript的类型推断顺序:无括号时是“先看目标类型再适配函数”,有括号时是“先确定函数类型再对比目标类型”。
内容的提问来源于stack exchange,提问作者Blue Nebula
相关产品推荐
相关产品推荐

