【发布时间】:2018-10-16 10:27:02
【问题描述】:
我按照那边Typescript Mixins的例子:mixin,做了一些改动,
以下代码显示了关系:Point
class Point {
constructor(public x: number, public y: number) { }
export() {
return { x: this.x, y: this.y };
}
}
type Constructor<T> = new (...args: any[]) => T;
function Tagged<T extends Constructor<Point>>(Base: T) {
return class extends Base {
_tag: string;
constructor(...args: any[]) {
super(...args);
this._tag = "";
}
export() {
return {
...super.export(),
_tag: this._tag,
};
}
};
}
function Madded<T extends Constructor<Point>>(Base: T) {
return class extends Base {
_mad: string;
constructor(...args: any[]) {
super(...args);
this._mad = "";
}
export() {
return {
...super.export(),
_mad: this._mad,
};
}
};
}
const TaggedPoint = Tagged(Point);
let tag = new TaggedPoint(10, 20);
tag._tag = "hello";
// typescript does not complaint about ._tag
console.log(tag.export()._tag);
const MadedTaggedPoint = Madded(TaggedPoint);
const mad = new MadedTaggedPoint(10, 20);
// typescript complaints:
// [ts] Property '_tag' does not exist on type '{ _mad: string; x: number; y: number; }'.
// because MadedTaggedPoint mixed TaggedPoint, so I thought mad.export() shuold have _tag property
console.log(mad.export()._tag);
【问题讨论】:
-
你有几个错别字..
console.log(point.export()._mad);应该是console.log(mad.export()._mad);而在Madded你导出_tag而不是_mad。但这里也有一个真正的问题。如果您做出我建议的更改,最终的mad.export()将返回一个带有_mad但不是_tag的对象这是您真正的问题吗? -
当然,我纠正了错别字,因为 MadedTaggedPoint 混合了 TaggedPoint,所以我认为 mad.export() 应该有 _tag 属性
标签: typescript mixins