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

能否在TypeScript接口中通过条件定义关联属性的类型?

在TypeScript中定义关联属性的条件类型解决方案

当然可以实现这种属性间的关联约束,单一接口没法表达这种条件依赖,但可以用联合类型拆分不同的业务场景,让TypeScript识别属性间的逻辑关联。

具体实现方式

先把物品的情况拆分成三类,对应你的业务规则:

  1. 可售卖(sellable: true):不管是否可购买,price必须是number
  2. 可购买(buyable: true):不管是否可售卖,price必须是number
  3. 既不可买也不可卖:price为undefined

可以先提取公共属性到基础接口减少重复,再组合成联合类型:

// 公共属性提取到基础接口
interface IItemBase {
  id: string;
  name: string;
  description: string;
  note: string | undefined;
  type: string;
  usable: boolean;
  usage: string;
}

// 联合类型定义完整的物品类型
type IItem = 
  // 可售卖时,price必为number
  (IItemBase & {
    sellable: true;
    buyable: boolean;
    price: number;
  }) |
  // 可购买时,price必为number
  (IItemBase & {
    sellable: boolean;
    buyable: true;
    price: number;
  }) |
  // 既不可买也不可卖时,price为undefined
  (IItemBase & {
    sellable: false;
    buyable: false;
    price: undefined;
  });

使用效果

定义完成后,TypeScript会自动根据sellable和buyable的值推断price的类型,无需冗余的类型守卫:

function processItem(item: IItem) {
  if (item.buyable) {
    // 这里TypeScript明确知道price是number,直接用就行
    console.log(`购买价:${item.price}`);
  }

  if (item.sellable || item.buyable) {
    // 同样,price肯定是number,不用额外判断
    const discountedPrice = item.price * 0.9;
    console.log(`优惠价:${discountedPrice}`);
  } else {
    // 这里price是undefined,对应不可交易的场景
    console.log("该物品无法交易");
  }
}

这种方式完全贴合你的业务规则,让类型系统准确反映属性间的关联,消除不必要的类型判断代码。

内容的提问来源于stack exchange,提问作者Tetie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:28