Typescript 合并两个接口

Typescript 合并两个接口,typescript,Typescript,寻求确认或澄清 如果我有两个接口。创建这两个接口合并的“正确”方法是什么 IFoo{ //一些东西 } 伊巴尔{ //一些东西 } IFooBar扩展了IFoo、IBar{ //空的 } 它可以工作,但感觉很奇怪,就像我用空的IFooBar做错事一样 我这样做对吗 我还注意到,这同样有效: 类型IFooBar=IFoo&IBar; 我对使用类型有一种不合逻辑的厌恶,但是它更干净。很好地解释了接口和类型别名之间的关系,重点是它们之间的细微差别 两者 及 是实现这一点的常用方法,在大多数情况下表

寻求确认或澄清

如果我有两个接口。创建这两个接口合并的“正确”方法是什么

IFoo{
//一些东西
}
伊巴尔{
//一些东西
}
IFooBar扩展了IFoo、IBar{
//空的
}
它可以工作,但感觉很奇怪,就像我用空的IFooBar做错事一样

我这样做对吗

我还注意到,这同样有效:

类型IFooBar=IFoo&IBar;
我对使用
类型有一种不合逻辑的厌恶,但是它更干净。

很好地解释了接口和类型别名之间的关系,重点是它们之间的细微差别

两者

是实现这一点的常用方法,在大多数情况下表现相同。由于
type
需要更少的字符来键入,因此可以选择它

由混合的
接口
类型
引起的不一致不应该是问题;它们只是实现目标的合适特性。如果
const BarClass=FooClass
完成了这项工作,
class BarClass扩展FooClass{}
不应该仅仅因为它在任何地方都一致地使用
class
(本例用于说明目的,这些方法之间存在很大的差异)

尽管
接口
类型
的行为类似,但在合并接口的情况下(链接文章中也有介绍)会有所不同。这将有助于:

interface FooBar extends IFoo, IBar {}
class FooBar { ... }
这将导致类型错误:

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

我认为合并接口的意义是好的,还是不好。如果从面向对象设计的角度来看,
IFooBar
是一个新实体,那么空接口就可以了。但是,如果没有这样的实体,但您只想合并一些不相关的接口(对于一些黑客代码),那么只需在变量类型定义中使用
IFoo&IBar
,或者使用
type
来缩短这个过程


<> P>这只是程序员的观点,来自于C++和C语言的面向对象语言,

< P>如果你想要<强> >合并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'

当然同意,交叉点和接口扩展之间最直接的区别可能是如何合并属性类型,尤其是方法。第一种方法现在在编译TS 3.4时出现错误。3@Musa哪一个?你能举个例子吗?@EstusFlask我想我犯了一个错误,它们都仍然被支持,我的困惑是由于下面的错误造成的<代码>src/app/pages/requests/details/details.types.ts中的错误(82,18):错误TS2320:接口“IRequestDetailsForm”不能同时扩展类型“IRequestContractPartial”和“IAVRCSVendor”。“IRequestContractPartial”和“IAVRCSVendor”类型的命名财产“contractor\u license\u number”不相同。
@Musa是的,这两个接口似乎不兼容。
type FooBar = IFoo & IBar;
class FooBar { ... }
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'