我正在使用外部库,它在回调中返回类型a
的实例化对象A
,其中A
被定义为接口 (外部模块不会导出A
的类实现):
extLib.on("someEvent", ((a: A) => { /*...*/ });
现在我想将一个类型B
的mixin对象添加到已存在的A
实例中:
class B {
someExtension() { /* ... */ }
}
我目前的方法有点糟糕:
function Add_B(a: A): (A & B) {
// cast to intersection type
let _a = a as (A & B);
_a.someExtension = () => { /* ... */ }
return _a;
}
extLib.on("someEvent", ((a: A) => {
let _a = Add_B(a);
// mixin achieved, _a is of type (A & B)
});
现在有人知道一种更好的方法:
B
拥有可调用的构造函数并使B
成为新的A & B
交叉类型readonly
上的B
属性?static
成员)
?答案 0 :(得分:0)
这个怎么样:
interface A {
prop: string;
}
class B {
// so the same function can be shared between instance of B and instances of A & B
static someExtensionStatic = () => { /* ... */ }
someExtension = B.someExtensionStatic;
readonly prop2: number;
constructor(a?:A) {
if (a) {
let a1 = a as AandB;
a1.someExtension = B.someExtensionStatic;
return a1;
}
}
}
type AandB = A & B;
并在您的主叫代码中:
extLib.on("someEvent", ((a: A) => {
let _a = new B(a) as AandB;
// mixin achieved, _a is of type (A & B)
}));
一个问题:B
的新实例的原型将位于B.prototype
,但A
的实例将不具有B.prototype
的原型。
<强>更新强>
原型差异的结果将导致以下结果:
var b1 = new B();
var isInstanceOf = b1 instanceof B; // true
var b2 = new B(a);
isInstanceOf = b2 instanceof B; // false
因此,您应该决定结果对象的类型:
A的实例,使用B
的成员进行扩充在这种情况下,new B(a)
没有意义;
B.augment<T>: T & B
方法更合适
instanceof
将合理地工作