【发布时间】:2018-02-12 23:12:54
【问题描述】:
根据 MPJ 的这个精彩的 Composition over Inheritance 视频,我一直在尝试用 TypeScript 制定组合。我想编写类,而不是对象或工厂函数。这是我到目前为止的努力(在 lodash 的帮助下):
class Barker {
constructor(private state) {}
bark() {
console.log(`Woof, I am ${this.state.name}`);
}
}
class Driver {
constructor(private state) {}
drive() {
this.state.position = this.state.position + this.state.speed;
}
}
class Killer {
constructor(private state) {}
kill() {
console.log(`Burn the ${this.state.prey}`);
}
}
class MurderRobotDog {
constructor(private state) {
return _.assignIn(
{},
new Killer(state),
new Driver(state),
new Barker(state)
);
}
}
const metalhead = new MurderRobotDog({
name: 'Metalhead',
position: 0,
speed: 100,
prey: 'witch'
});
metalhead.bark(); // expected: "Woof, I am Metalhead"
metalhead.kill(); // expected: "Burn the witch"
这导致:
TS2339:“MurderRobotDog”类型上不存在属性“bark”
TS2339:“MurderRobotDog”类型上不存在属性“kill”
在 TypeScript 中进行类组合的正确方法是什么?
【问题讨论】:
-
我不知道
_.assignIn是什么,但这看起来更像是混合而不是组合。不,你不能轻易混合多个classes -
@Bergi lodash.com/docs/4.17.5#assignIn。是的,我的努力在这里解决了这个答案:stackoverflow.com/a/39243098/2013891 - 这表明我们应该总是更喜欢混合而不是原型语言中的成员组合。 ¯_(ツ)_/¯
-
MPJ 的构图完全错误,而实际的构图从未出现在他的视频中。您正在寻找的是所谓的多重继承或混合。 reddit.com/r/programming/comments/5dxq6i/…
-
@GlennMohammad ...但您是否也知道为什么
MurderRobotDog实例没有任何预期的(原型)方法?和/或您是否已经阅读过您的 TS 转译成的 JavaScript 代码? -
@JeffM 感谢您的指点!该线程确实使我对实际构图有所了解。 ❤︎ 我一直认为mixin是一种组合形式。
标签: javascript class typescript composition ecmascript-2016