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

如何实现TypeScript中isEdit为true时menuOpenId为number,否则为boolean?

实现isEdit与menuOpenId的类型关联

要让isEdit和menuOpenId的类型严格绑定(isEdit为true时menuOpenId必须是number,为false时必须是boolean),可以通过联合类型绑定属性关系或泛型条件类型实现,两种方案如下:

方案一:联合类型(推荐,直观易读)

直接定义两种状态的props类型并组成联合,TypeScript会自动进行类型窄化:

type IProps = 
  | { isEdit: true; menuOpenId: number }
  | { isEdit: false; menuOpenId: boolean };

function useMenuForm({ isEdit, menuOpenId }: IProps) {
  // 函数内部判断isEdit后,menuOpenId类型自动推断
  if (isEdit) {
    // 此处menuOpenId为number类型
    console.log(menuOpenId.toFixed(2));
  } else {
    // 此处menuOpenId为boolean类型
    console.log(menuOpenId.toString());
  }
}

// 调用示例:类型不匹配会直接报错
useMenuForm({ isEdit: true, menuOpenId: 123 }); // 合法
useMenuForm({ isEdit: false, menuOpenId: false }); // 合法
useMenuForm({ isEdit: true, menuOpenId: false }); // 类型错误

方案二:泛型条件类型

通过泛型参数和条件类型动态推导menuOpenId的类型:

type IProps<T extends boolean> = {
  isEdit: T;
  menuOpenId: T extends true ? number : boolean;
};

function useMenuForm<T extends boolean>({ isEdit, menuOpenId }: IProps<T>) {
  if (isEdit) {
    // menuOpenId 推断为number
  } else {
    // menuOpenId 推断为boolean
  }
}

// 调用时可显式指定泛型,也可让TS自动推断
useMenuForm<true>({ isEdit: true, menuOpenId: 456 });
useMenuForm({ isEdit: false, menuOpenId: true });

两种方案都能实现属性间的类型约束,避免出现isEdit为true但menuOpenId传布尔值这类不合法的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:55:31