作者回复: 交叉类型表示一种类型(取所有属性的并集,如果需要新增属性则需要再交叉一个类型);而继承则是表示一种值(子类继承父类的属性,也可以任意定义自己的属性),本质上是不同的。如果想实现你代码的效果,可以这样: class Dog {} class Cat {} type DogCat = Dog & Cat class Animal implements DogCat{}
作者回复: 这个问题比较有趣。接口的属性分两种,如果是基本类型,比如: interface A { a: number } interface B { a: string } let foo: A & B = { a: } 你会发现对象 foo 的属性 a 的类型应该是 never,即 number & string 的类型。但 TS 规定没有任何值可以赋值给 never 类型,所以无论怎么赋值都会失败。 如果属性是函数,情况略有不同: interface A { f(a: number): number } interface B { f(a: string, b: string): string } let foo: A & B = { f(a: never) { return a } } 在交叉类型中,发生了函数重载,foo中的具体实现应该是一个宽泛的版本,同时兼容A和B中的定义:参数个数上,要选择最少的,参数类型和返回值类型参考前面的例子,取 number & string,即 never。这样不会报错。 实际上应该避免这种情况发生,仅做实验探讨吧。
作者回复: 继承可以有自己的属性,交叉不可以。
作者回复: 增加Circle类型了吗? type Shape = Square | Rectangle | Circle; 如果增加了,但没有计算面积的逻辑是会报错的。
作者回复: 在类型未确定的情况下,只能访问共有成员,instanceof 已经确定了类型。