为何这段TypeScript代码未出现类型错误?
TypeScript允许参数更少的函数赋值给目标类型的原因
这是TypeScript函数兼容性规则的设计结果,核心逻辑是这种赋值在JavaScript运行时是完全安全的:
- 当你把
() => 123赋值给Foo类型(要求接收一个number参数并返回number)时,调用foo(123)时,JS会自动忽略未被函数接收的多余参数,函数依然能正常返回123,不会触发任何运行时错误。 - TypeScript的类型系统优先保障运行时安全性,既然这种赋值不会导致问题,就允许通过类型检查。
额外说明
反过来的场景(参数更多的函数赋值给参数更少的函数类型),虽然TypeScript默认允许,但实际调用时可能隐含风险(比如函数期望接收参数但调用时未传入,参数值会变成undefined)。不过开启strictFunctionTypes严格模式后,TypeScript会对这类场景进行更严格的校验。
实际运行验证
下面的代码可以正常运行,不会有任何问题:
type Foo = (a: number) => number; const foo: Foo = () => 123; console.log(foo(456)); // 输出 123
而如果传入不符合类型要求的参数,TypeScript会立刻报错:
foo('hello'); // 类型错误:"string"类型参数无法赋值给"number"类型参数
内容的提问来源于stack exchange,提问作者Lee Jongseo
相关产品推荐
相关产品推荐

