TypeScript函数返回类型与参数校验规则相关疑问咨询
TypeScript 三类函数类型校验现象对应的规则说明
1. 返回值类型不匹配报错的规则
你第一段代码的返回值类型约定为() => string,要求返回的函数必须返回string类型的值。但实际返回的箭头函数返回值是数字123,属于返回值类型不匹配,TypeScript会对函数返回值做协变校验,子类型必须兼容父类型,number不能赋值给string,因此直接抛出类型错误。
2. 返回void类型不校验返回值的规则
第二段代码的返回值类型约定为() => void,这里用到了TypeScript对void返回值的特殊设计:当函数类型的返回值被定义为void时,不校验实际函数的返回值类型。
这个设计是为了兼容大量不需要关心回调返回值的场景,比如数组遍历方法的回调,即使你在回调中返回任意值,也不会被判定为类型错误。因此你返回的函数实际返回123也不会触发报错。
3. 函数参数个数兼容的规则
第三段代码的返回值类型约定为(a: number) => string,但实际返回的是无参函数,这里用到了TypeScript函数参数的逆变校验规则:参数更少的函数可以赋值给参数更多的函数类型。
这种设计是基于运行时安全性考虑的:当你按照类型约定调用返回的函数时,会传入一个number参数,而实际的函数只是忽略了这个参数,不会引发任何运行时错误,因此TypeScript判定这种写法是类型安全的。反过来如果实际返回的函数参数比约定的多,就会触发类型错误,因为调用时不会传入多余参数,会导致函数内部访问未定义的变量。
内容的提问来源于stack exchange,提问作者fires3as0n
相关产品推荐
相关产品推荐

