为何TypeScript中无参函数可赋值给带string参数的函数类型?
为什么这段TypeScript代码能正常编译
这段代码能通过编译,核心原因是TypeScript的函数兼容性规则:当你把一个函数赋值给另一个函数类型的变量时,只要源函数能安全处理目标函数的调用场景,就会被判定为类型兼容。
具体到你的代码:
- 变量
z的类型是(s:string)=>void,要求调用它时必须传入一个字符串参数 - 被赋值的函数是
() => alert("HI"),它不接收任何参数
在JavaScript中,调用函数时传入的参数数量多于函数声明的个数,多余参数会被自动忽略,不会触发运行时错误。TypeScript遵循这一原生JS行为逻辑,认为这种赋值是安全的:当你调用z("HI")时,源函数虽然不接收参数,但能正常执行(只是忽略传入的"HI"),不会引发问题。
反过来,如果把需要参数的函数赋值给不需要参数的变量(比如let z: ()=>void = (s:string) => alert(s)),TypeScript才会报错——因为调用z()时会导致源函数缺少必要参数,存在运行时风险。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

