合并两个接口

时间:2018-04-08 21:59:52

标签: typescript

寻求确认或澄清

如果我有两个接口。什么是"适当的"创建这两个接口的合并的方法。

IFoo{
  // some stuff
}

酒吧

IBar{
  // some stuff
}

IFooBar

IFooBar extends IFoo, IBar{
 // Empty
}

它有效,但感觉很奇怪,就像我对空IFooBar做错了。

我这样做是否正确?

我也注意到这也有效:

type IFooBar = IFoo & IBar;

我对使用type抱有不合逻辑的厌恶,但它更清晰。

3 个答案:

答案 0 :(得分:32)

This article很好地解释了接口和类型别名之间的关系,this part专注于它们之间的微小差异。

两个

interface IFooBar extends IFoo, IBar {}

type IFooBar = IFoo & IBar;

是执行此操作的常用方法,并且在大多数情况下行为相同。由于type输入的字符较少,因此可以选择它。

混合interfacetype引起的不一致应该不是问题;它们只是实现目标的合适功能。如果const BarClass = FooClass执行此任务,class BarClass extends FooClass {}不应该首选,因为它始终在任何地方使用class(此示例用于说明目的,这些方法之间存在相当大的差异)。< / p>

即使interfacetype的行为相似,但合并界面的情况也有所不同(链接文章中也有介绍)。这将有效:

interface FooBar extends IFoo, IBar {}
class FooBar { ... }

这会导致类型错误:

type FooBar = IFoo & IBar;
class FooBar { ... }

答案 1 :(得分:0)

我认为没关系,或者与合并界面的含义无关。如果IFooBar是面向对象设计的新实体,那么空接口就可以了。但是如果没有这样的实体,但是你想要合并一些不相关的接口(对于一些hacky代码) - 那么只需在变量类型定义中使用IFoo & IBar,或者type来缩短它。

这只是我对程序员的看法,它来自面向对象语言,如C ++和C#。

答案 2 :(得分:0)

如果您想合并2个包含深度超过1级成员的接口

export interface TypeOne  {
  one: {
    two: {
      hello: string;
    }[]
  }
}

export type TypeTwo = {
  one: {
    two: {
      world: string;
    }[]
  }
} & TypeOne;

const x: TypeTwo;
x.one.two[0]. // autocompletes options are 'hello' / 'world'