寻求确认或澄清
如果我有两个接口。什么是"适当的"创建这两个接口的合并的方法。
富
IFoo{
// some stuff
}
酒吧
IBar{
// some stuff
}
IFooBar
IFooBar extends IFoo, IBar{
// Empty
}
它有效,但感觉很奇怪,就像我对空IFooBar做错了。
我这样做是否正确?
我也注意到这也有效:
type IFooBar = IFoo & IBar;
我对使用type
抱有不合逻辑的厌恶,但它更清晰。
答案 0 :(得分:32)
This article很好地解释了接口和类型别名之间的关系,this part专注于它们之间的微小差异。
两个
interface IFooBar extends IFoo, IBar {}
和
type IFooBar = IFoo & IBar;
是执行此操作的常用方法,并且在大多数情况下行为相同。由于type
输入的字符较少,因此可以选择它。
混合interface
和type
引起的不一致应该不是问题;它们只是实现目标的合适功能。如果const BarClass = FooClass
执行此任务,class BarClass extends FooClass {}
不应该首选,因为它始终在任何地方使用class
(此示例用于说明目的,这些方法之间存在相当大的差异)。< / p>
即使interface
和type
的行为相似,但合并界面的情况也有所不同(链接文章中也有介绍)。这将有效:
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'