为何返回Promise<number>的TypeScript代码能绕过类型检查?
问题原因分析
你这段代码能绕过TypeScript的类型检查,核心原因是手动给resolve标注了Function类型。
Function是TS里最宽泛的函数类型,它不限制参数的类型、数量,也不约束返回值。当你把resolve定义成Function时,TS会完全跳过对它的参数校验,所以传入字符串"me"不会触发编译错误。
如果去掉resolve的类型标注,让TS自动推导类型,它会根据Promise<number>的泛型参数,自动把resolve推导为(value: number | PromiseLike<number>) => void类型。这时候再传字符串进去,就会立刻触发编译错误:
function Me(): Promise<number> { return new Promise( (resolve, reject) => { resolve("me"); // 编译报错:类型"string"的参数不能赋给类型"number | PromiseLike<number>"的参数 } ) }
至于严格编译配置的影响:哪怕你开启了strict: true,只要手动把resolve标注为Function,TS同样不会报错——因为Function本身就是设计用来兼容任意函数的兜底类型。但如果没开严格模式,TS对类型推导的宽松度会更高,不过这不是导致当前问题的核心原因。
内容的提问来源于stack exchange,提问作者sz ppeter
相关产品推荐
相关产品推荐

