You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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实例?


失败原因

  1. 类型不匹配:Product的rate是number | null类型,但OrderItem要求rate必须是number,TypeScript无法自动确认rate一定非空。
  2. 多余属性溢出:扩展运算符会复制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:45:15