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'