我有两个interfaces,其中一个延伸到另一个.然而,我希望能够扩展第一个interface并使其所有类型都可选.我不想把第一个interface的所有定义都重写成第二个interface的可选定义(因为在那一点上扩展有什么好处?)或者重新定义第一个interface,因为它正在其他地方使用.

它看起来像什么:

interface First {
  type1: string
  type2: string
}

// Seemingly pointless rewrite (why would I even need to extend?)
interface Second extends First {
  type1?: string
  type2?: string
  type3: string
  type4: string
}

// What I imagine the extending should be (but doesn't work)
interface Second extends First? {
  type3: string
  type4: string
}

我做了研究,确实发现this question个答案非常相似,但自从这个问题被提及已经一年了,我认为我的问题并不完全相同,因为我想让entire扩展interface可选,而不仅仅是其中的几个类型.

有没有办法在Typescript中做到这一点,或者我只需要吸收它,然后做一个长的interface秒?


更新(解释我为什么想要这份工作):

我正在编写一个React web应用程序,其中有一个组件可以显示我数据库中的一个实体,允许用户编辑该实体的任何值.我希望我的React组件能够处理用户创建新实体的情况,以及用户编辑现有实体的情况.

为了与上面的示例保持一致,假设我的数据库实体的值由First interface复制,React组件使用Second interface中存在的两个传递的props .react 组分always将具有Second中的两个值,但不一定具有First的值.

在用户创建一个新实体的情况下,我希望只使用Second的值来构造React组件,而不必为First中的所有内容指定null个值.在用户编辑现有实体的情况下,我将传递FirstSecond中的所有内容.

在这两种情况下,它都是相同的UI,但使用不同的值集构建.

推荐答案

您可以在Partial类型上使用type aliasesintersection:

type First = {
    type1: string;
    type2: string;
}

type Second = Partial<First> & {
    type3: string;
    type4: string;
}

Typescript相关问答推荐

将对象属性路径描述为字符串数组的类型

角形标题大小写所有单词除外

在配置对象上映射时,类型脚本不正确地推断函数参数

如何在TypeScrip面向对象程序设计中用方法/属性有条件地扩展类

如何将类型从变量参数转换为返回中的不同形状?

输入元素是类型变体的对象数组的正确方法是什么?'

打印脚本丢失函数的泛型上下文

有没有办法解决这个问题,类型和IntrinsicAttributes类型没有相同的属性?

类型脚本`Return;`vs`Return unfined;`

无法从Chrome清除还原的初始状态数据

寻址对象中路径的泛型类型

是否可以判断某个类型是否已合并为内部类型?

如何在typescript中为this关键字设置上下文

找不到财产的标准方式?

如何在React组件中指定forwardRef是可选的?

为什么S struct 类型化(即鸭子类型化)需要非严格类型联合?

打字错误TS2305:模块常量没有导出的成员

在单独的组件中定义React Router路由

在Google授权后由客户端接收令牌

如何避免多个类型参数重复?