TypeScript箭头函数返回对象字面量忽略多余属性问题求解
TypeScript 箭头函数返回对象字面量多余属性校验问题
问题描述
使用TypeScript时存在如下特性表现:为箭头函数指定对象类型的返回值时,向返回的对象字面量中添加任意额外属性都不会触发类型报错;但如果缺失必填属性、属性类型不符合定义,TS会正常抛出错误。如果直接为const变量声明对应对象类型,多余属性会被正常检测。需求是实现箭头函数返回对象的严格精确类型校验,不允许出现类型定义外的属性。
示例代码
type TestType = { foo: string, bar: string, } // TS2741: 类型“{ bar: string; }”缺少类型“TestType”中的必需属性“foo” const propMissing: TestType = { bar: 'asd', }; // TS2322: 不能将类型“{ bar: string; foo: string; baz: number; }”分配给类型“TestType” // 对象字面量只能指定已知属性,而“baz”不存在于类型“TestType”中 const propAdded: TestType = { bar: 'asd', foo: 'ada', baz: 2, }; // TS2322: 不能将类型“number”分配给类型“string” const propType: TestType = { bar: 'asd', foo: 2, }; // 无报错 const allGood: TestType = { bar: 'asd', foo: 'asd', }; // 无报错,符合预期,因为propMissing本身已经被声明为TestType类型 const funcObjRefMissing: () => TestType = () => { return propMissing; }; // 无报错,符合预期,因为propAdded本身已经被声明为TestType类型 const funcObjRefAdded: () => TestType = () => ({ ...propAdded, }); // 无报错,但预期和上面的propAdded一致抛出TS2322错误 const funcObjLiteral: () => TestType = () => ({ foo: 'sf', bar: 'aasd', baz: 2 }); // TS2339: 类型“TestType”上不存在属性“baz” funcObjLiteral().baz; // 和上面的情况表现一致 const funcObjDestruct: () => TestType = () => { return { ...allGood, baz: 2 }; } funcObjDestruct().baz; // TS2741: 类型“{ foo: string; }”缺少类型“TestType”中的必需属性“bar” const funcPropMissing: () => TestType = () => ({ foo: 'sad', });
核心诉求
当返回对象包含TestType未定义的baz属性时,编译器可以抛出对应的TS2322错误。
结论与解决方案
出于设计层面的合理考量,目前TS暂不支持箭头函数返回对象字面量的多余属性校验,未来也大概率不会支持。
如果可以接受调整代码格式,将箭头函数改写为普通函数,就可以正常触发返回值的多余属性校验,示例如下:
// TS2322: 不能将类型“{ foo: string; bar: string; baz: number; }”分配给类型“TestType” // 对象字面量只能指定已知属性,而“baz”不存在于类型“TestType”中 function funcObjLiteral(): TestType { return { foo: 'sf', bar: 'aasd', baz: 2 }; }
内容的提问来源于stack exchange,提问作者Claus Marin Kaiser
相关产品推荐
相关产品推荐

