TypeScript返回Promise的函数为何不触发对象字面量多余属性校验
结论
这是TypeScript的预期设计行为,并非你遗漏了配置项。
原因解释
TypeScript的对象字面量多余属性校验规则仅在「对象字面量直接赋值给明确标注了目标类型的变量/直接作为返回值匹配目标类型」的场景下触发:
- 你第一个示例中,函数返回值类型明确标注为
IReturnVal,return后直接跟对象字面量,完全匹配触发校验的场景,所以多余属性c会报错。 - 你第三个返回Promise的示例中,对象字面量是作为
Promise.resolve()的入参传入,TypeScript会先根据入参推导出Promise.resolve返回的类型为Promise<{a: boolean, b: boolean, c: number}>,而这个类型和你标注的Promise<IReturnVal>是结构兼容的(所有IReturnVal要求的属性都存在且类型匹配),所以TS会认为赋值合法,不会触发多余属性校验。 - 缺失属性会报错的原因是:推导出来的Promise泛型如果缺少
IReturnVal要求的属性,结构不兼容,自然会抛出类型错误。
解决方案
如果希望返回Promise的场景也能触发多余属性校验,可以用以下任意一种方式:
方式1:给Promise.resolve显式指定泛型参数
function ok(): Promise<IReturnVal> { // 此处会触发多余属性报错 return Promise.resolve<IReturnVal>({ a: true, b: false, c: 1, }); }
方式2:提前声明返回对象的类型
function ok(): Promise<IReturnVal> { // 此处会触发多余属性报错 const res: IReturnVal = { a: true, b: false, c: 1, }; return Promise.resolve(res); }
方式3:改用async函数定义
async函数直接return对象字面量时,会触发多余属性校验:
async function ok(): Promise<IReturnVal> { // 此处会触发多余属性报错 return { a: true, b: false, c: 1, }; }
内容的提问来源于stack exchange,提问作者Timothy Lee
相关产品推荐
相关产品推荐

