TypeScript函数返回类型疑问:返回string的函数为何可适配void回调参数
问题原因解释
这是TypeScript针对void返回类型的函数专门设计的类型兼容性规则,属于正常的设计行为,不是BUG。
- 当你给函数参数定义
callbackFn: (name: string) => void类型时,这里的void的语义是:调用该回调函数时,会完全忽略它的返回值,而不是要求传入的回调必须没有返回值。 - 你的
greet函数满足入参匹配的要求(接收一个string类型参数),同时就算它返回string,在doSomething内部调用callbackFn(name)时也没有用到这个返回值,不会产生任何运行时问题,因此TypeScript允许这种类型兼容。
注意区分两种void的不同场景
要注意和直接声明函数返回void的场景做区分:
// 这种写法会直接报错:不能将类型“string”分配给类型“void” function test(): void { return 'test' }
只有当你将一个有返回值的函数,赋值给返回值为void的函数类型变量/参数的时候,上述的兼容规则才会生效。
额外验证
你可以尝试修改doSomething的实现,主动使用回调的返回值,就会收到TypeScript的报错提示:
function doSomething(name: string, callbackFn: (name: string) => void) { const res = callbackFn(name); res.toUpperCase() // 报错:类型“void”上不存在属性“toUpperCase” }
这也符合前面的规则:TS默认回调返回值会被忽略,你如果主动使用就会被拦截,从根源上避免返回值被误用的问题。
内容的提问来源于stack exchange,提问作者theProCoder
相关产品推荐
相关产品推荐

