基于Props值的条件类型:TypeScript接口定义问题求助
解决方案
你可以用**区分联合类型(Discriminated Union)**来实现这个需求,这是TypeScript处理这类条件属性场景的标准方案,写法简洁且类型安全:
type ManageActions = | { action: "add" | "remove"; element: AddExtra; list: AddExtra[] } | { action: "edit"; element: AddExtra; list: AddExtra[]; indextoEdit: number }; function manageActions(params: ManageActions) { // 通过类型守卫缩小类型范围,安全访问indextoEdit if (params.action === "edit") { console.log(params.indextoEdit); // 此处TypeScript明确知道当前是edit类型,indextoEdit存在 } else { // 此处action为add/remove,不存在indextoEdit属性 } }
你之前的代码报错原因
你定义的IManageActions | IManageActionsEdit联合类型中,indextoEdit并非两个接口的共有属性,TypeScript不允许直接解构访问这类非共有属性。必须先通过类型守卫(比如判断action === "edit")确认当前类型是IManageActionsEdit后,才能安全访问该属性。
优化你原写法的另一种方式
如果想保留接口拆分的形式,可以抽离公共接口减少重复代码,再配合类型守卫使用:
interface IManageActionsBase { element: AddExtra; list: AddExtra[]; } interface IManageActionsAddRemove extends IManageActionsBase { action: "add" | "remove"; } interface IManageActionsEdit extends IManageActionsBase { action: "edit"; indextoEdit: number; } function manageActions( params: IManageActionsAddRemove | IManageActionsEdit ) { const { action, element, list } = params; if (action === "edit") { // TypeScript自动推断当前params为IManageActionsEdit类型 const { indextoEdit } = params; // 可安全使用indextoEdit } }
内容的提问来源于stack exchange,提问作者lcsaloon
相关产品推荐
相关产品推荐

