无需类型断言,如何让TypeScript识别Partial已变为完整类型?
解决方法
下面提供几种无需使用类型断言as的方案,让TypeScript自动识别对象已具备完整类型:
1. 对象字面量扩展(最简洁)
直接通过对象展开语法合并原对象与新属性,TypeScript会自动推断出合并后的对象类型为ThingWithMoreProperties:
const thingsWithMoreProperties = things.map((thing) => { return { ...thing, newProperty: 'swag' }; });
因为thing已经包含Thing的所有必填属性,加上新增的newProperty,完全匹配ThingWithMoreProperties的结构,TypeScript能直接确认类型。
2. 使用Object.assign
Object.assign的返回类型会自动合并所有参数的类型,同样可以让TypeScript正确推断:
const thingsWithMoreProperties = things.map((thing) => { return Object.assign({}, thing, { newProperty: 'swag' }); });
这里第一个参数是空对象,避免修改原thing对象,合并后的结果类型会被推断为ThingWithMoreProperties。
3. 自定义类型守卫函数
如果业务逻辑更复杂,需要显式验证对象完整性,可以写一个类型守卫函数,让TypeScript信任对象已经符合完整类型:
function isThingWithMoreProperties( obj: Partial<ThingWithMoreProperties> ): obj is ThingWithMoreProperties { // 验证所有必填属性存在(根据实际需求调整校验逻辑) return typeof obj.someProperty === 'string' && typeof obj.newProperty === 'string'; } const thingsWithMoreProperties = things.map((thing) => { const thingWithMoreProperties: Partial<ThingWithMoreProperties> = thing; thingWithMoreProperties.newProperty = 'swag'; // 这里通过类型守卫断言类型 if (!isThingWithMoreProperties(thingWithMoreProperties)) { throw new Error('Invalid ThingWithMoreProperties'); } return thingWithMoreProperties; });
这种方式适合需要严格校验属性存在性的场景,TypeScript会在类型守卫通过后自动将对象类型转换为ThingWithMoreProperties。
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

