我有两个接口:

export interface UploadAttemptBlocked {
  type: 'UploadAttempt';
  tab_id: string;
  blocked: true;
}

export interface UploadAttemptAllowed {
  type: 'UploadAttempt';
  tab_id: string;
  blocked: false;
  filepath: string;
}

当为blocked: true时,界面中不需要filepath.当blocked: false时,filepath应该在那里.

如何将这两个接口合并为%1?

推荐答案

您正在寻找的东西不能用接口来完成,但是可以用类型来完成.它被称为discriminated union types.

让我们为公共字段使用单独的类型:

type UploadAttemptCommonFields = {
  type: 'UploadAttempt';
  tab_id: string;
};

现在,UploadAttempt型应该是这样的:

type UploadAttempt = UploadAttemptCommonFields & (Blocked | Unblocked)

请注意,括号对于确保正确的优先级顺序很重要,因为我们希望union介于BlockedUnblocked之间.

最后一种类型:

type UploadAttemptCommonFields = {
  type: 'UploadAttempt';
  tab_id: string;
};

type UploadAttempt = UploadAttemptCommonFields &
  (
    | {
        blocked: true;
      }
    | {
        blocked: false;
        filepath: string;
      }
  );

Typescript相关问答推荐

泛型函数类型验证

是否可以根据嵌套属性来更改接口中属性的类型?

找不到带名称的管道''

HttpClient中的文本响应类型选项使用什么编码?''

在嵌套属性中使用Required

如何在typescript中设置对象分配时的键类型和值类型

路由链接不会导航到指定router-outlet 的延迟加载模块

Express Yup显示所有字段的所有错误

我可以为情态车使用棱角形的路由守卫吗?

使用泛型识别对象值类型

ANGLE NumberValueAccessor表单控件值更改订阅两次

类型与泛型抽象类中的类型不可比较

TypeScrip-根据一个参数值验证另一个参数值

将接口映射到交叉口类型

窄SomeType与SomeType[]

我的类型谓词函数不能像我预期的那样工作.需要帮助了解原因

如何使用useSearchParams保持状态

T的typeof键的Typescript定义

Typescript 从泛型推断类型

如何编写一个接受 (string|number|null|undefined) 但只返回 string 且可能返回 null|undefined 的函数?