TypeScript函数类型疑惑:为何可传入字符串调用函数?
问题原因解析
这种情况是TypeScript的类型兼容性和any类型的特性共同导致的,拆解成两点说明:
调用时的类型检查只看变量标注的类型
你定义的函数类型(...args: any[]) => void里,any[]表示参数可以是任意类型、任意数量。当你把具体实现赋值给这个类型的变量后,调用该变量时,TypeScript只会参照变量的标注类型做检查——既然any[]允许传任何参数,那传入字符串自然不会触发错误。实现函数的参数类型被
any“抹平”了
TypeScript的类型兼容性规则允许把参数更具体的函数赋值给参数更宽泛的函数类型。这里变量的参数是any[],比实现函数的number参数宽泛得多,所以赋值是合法的。同时,因为变量类型的参数是any,实现函数里的x会被TypeScript当作any类型处理——而any类型可以调用任何方法、访问任何属性,所以x.toFixed()不会触发类型错误,哪怕实际传入的是字符串。
对应的代码示例:
type Fn = (...args: any[]) => void; const fn: Fn = (x: number) => { console.log(x.toFixed()); // 无类型错误 }; fn("hello"); // 无类型错误
如果想要严格的类型校验,避免这种情况,别用any[],改成明确的参数类型即可,比如把函数类型定义为(x: number) => void,这样调用时传字符串就会报错,实现内部的类型也会被严格校验。
内容的提问来源于stack exchange,提问作者YOTTR
相关产品推荐
相关产品推荐

