如何在不复制对象的前提下移除子类字段以匹配父类类型?
TypeScript 不复制对象移除子类属性转为父类类型
针对第三方库定义的父接口A和继承自A的子接口B(含必填属性y),要在不复制对象的前提下,移除B类型对象的y字段使其匹配A类型,可通过以下几种方法绕过TypeScript的类型检查:
断言为
any类型后删除
利用any绕过类型校验,直接删除属性,之后再断言为A类型使用:// 绕过类型检查删除y字段 delete (b as any).y; // 此时b已符合A类型,可直接断言使用 const a: A = b as A;断言为带可选
y的交叉类型
通过交叉类型让y变为可选属性,让TypeScript允许删除操作:// 断言为A与可选y的交叉类型,允许删除y delete (b as A & { y?: string }).y; // 删除后b自动符合A类型 const a: A = b;修改属性配置后删除(非必要)
若对象属性的configurable被设为false(对象字面量默认不会出现此情况),可先修改配置再删除:Object.defineProperty(b, 'y', { configurable: true }); delete b.y; const a: A = b as A;
以上方法均直接修改原对象,无需创建副本,解决了TypeScript类型系统对必填属性和不存在属性的校验限制。
内容的提问来源于stack exchange,提问作者Sebastian Barth
相关产品推荐
相关产品推荐

