如何使用TypeScript类型提取对象部分属性并创建OrderItem实例?
问题描述
现有如下TypeScript接口及实例:
export interface Product { brandName: string; modelNo: string; rate: number | null; someOtherProp1: string; someOtherProp2: string; } export interface OrderItem { modelNo: string; rate: number; qty: number; } const exampleProduct: Product = { brandName: "Example Brand", modelNo: "12345", rate: 100, someOtherProp1: "Some Value 1", someOtherProp2: "Some Value 2" };
尝试通过扩展运算符从exampleProduct创建OrderItem实例但失败:
const exampleOrderItem: OrderItem = { ...exampleProduct, qty: 10 };
请问如何正确实现从Product实例提取部分属性来创建OrderItem实例?
失败原因
- 类型不匹配:
Product的rate是number | null类型,但OrderItem要求rate必须是number,TypeScript无法自动确认rate一定非空。 - 多余属性溢出:扩展运算符会复制
Product的所有属性(如brandName、someOtherProp1等),而这些属性不属于OrderItem,触发类型检查报错。
解决方法
方法1:显式提取属性+类型安全检查
手动提取所需属性,同时通过前置检查确保rate的类型符合要求:
// 先校验rate非空,避免类型错误 if (exampleProduct.rate === null) { throw new Error("商品价格不能为空,无法生成订单项"); } const exampleOrderItem: OrderItem = { modelNo: exampleProduct.modelNo, rate: exampleProduct.rate, qty: 10 };
如果能确定当前exampleProduct.rate一定非空,也可以用类型断言(仅在数据确定安全时使用):
const exampleOrderItem: OrderItem = { modelNo: exampleProduct.modelNo, rate: exampleProduct.rate as number, qty: 10 };
方法2:封装工具函数复用逻辑
写一个通用转换函数,统一处理属性提取和类型校验:
function convertToOrderItem(product: Product, qty: number): OrderItem { if (product.rate === null) { throw new Error("无效的商品价格"); } return { modelNo: product.modelNo, rate: product.rate, qty }; } const exampleOrderItem = convertToOrderItem(exampleProduct, 10);
方法3:类型断言绕过检查(不推荐)
如果只是临时绕过类型检查(会丢失类型安全,可能隐藏bug),可以用类型断言:
const exampleOrderItem = { ...exampleProduct, qty: 10 } as OrderItem;
内容的提问来源于stack exchange,提问作者muon
相关产品推荐
相关产品推荐

