模仿多重继承
Imitate multiple inheritance
有一个classFirst
和构造函数Second
。我正在尝试创建一个 class Both
作为它们两者的 child。更准确地说,我正在将方法从构造函数原型复制到 child class 原型。
我明白这不是真正的继承,但对我来说已经足够了。
还有其他问题。如何让打字稿接受复制的方法?
class First {
someMethod() {
console.log('someMethod from First');
}
}
function Second() {
console.log('Second');
}
Second.prototype.doSmth = function () {
console.log('doSmth from Second');
}
interface IBoth {
someMethod()
doSmth()
}
class Both extends First /* implements IBoth */ {
constructor() {
console.log('constructor of Both');
super();
Second.call(this);
}
}
for (let key in Second.prototype) {
Both.prototype[key] = Second.prototype[key];
}
事实上,我需要更深入地了解方法:
class Final extends Both {
doIt() {
this.someMethod();
//this.doSmth(); // How to make this call threated as correct?
(this as any as IBoth).doSmth(); // That compiles, but it's awfull
}
}
如果在这种情况下方法在 class Both
中不可见,没关系。
我已经试过了:
写作时
class Both extends First implements IBoth {
typesctipt 说我还没有实现接口方法。
将 Both
重命名为 _Both
并使用
var Both = _Both as typeof _Both;
留下与原始代码相同的问题,因为 First
从未被提及。
如果我将 Both
重命名为 _Both
并写入
var Both = _Both as typeof IBoth;
typescript 找不到 IBoth
.
还有其他方法可以到达吗?
您可以在 http://www.typescriptlang.org/Playground
试试
Full code there
添加此行和 运行 代码(将代码从右侧面板复制到浏览器控制台):
(new Final).doIt();
行 this.doSmth();
未注释时的输出:
constructor of Both
Second
someMethod from First
doSmth from Second
doSmth from Second
试试这个:
class Both extends First {
constructor() {...}
doSmth: typeof Second.prototype.doSmth;
}
最好将 Second
作为 class 而不是函数。如果是 javascript 模块,请添加声明文件。
最后,如果您不能为 Second
添加类型,只需像这样为每个函数添加类型:
class Both extends First {
constructor() {...}
doSmth: () => void;
}
不需要接口。只需要声明一个原型字段 via
doSmth: () => void
它作为一个 属性 可见,而不是作为一种方法,但没关系。
完整列表:
class First {
someMethod() {
console.log('someMethod from First');
}
}
function Second() {
console.log('Second');
}
Second.prototype.doSmth = function () {
console.log('doSmth from Second');
}
class Both extends First {
constructor() {
console.log('constructor of Both');
super();
Second.call(this);
}
doSmth: () => void
}
for (let key in Second.prototype) {
Both.prototype[key] = Second.prototype[key];
}
class Final extends Both {
doIt() {
this.someMethod();
this.doSmth();
//Both.prototype.doSmth(); // ok
//Final.prototype.doSmth(); // ok
}
}
PS:typescript class prototype variable
应该 google 而不是关于继承的不同组合。
有一个classFirst
和构造函数Second
。我正在尝试创建一个 class Both
作为它们两者的 child。更准确地说,我正在将方法从构造函数原型复制到 child class 原型。
我明白这不是真正的继承,但对我来说已经足够了。
还有其他问题。如何让打字稿接受复制的方法?
class First {
someMethod() {
console.log('someMethod from First');
}
}
function Second() {
console.log('Second');
}
Second.prototype.doSmth = function () {
console.log('doSmth from Second');
}
interface IBoth {
someMethod()
doSmth()
}
class Both extends First /* implements IBoth */ {
constructor() {
console.log('constructor of Both');
super();
Second.call(this);
}
}
for (let key in Second.prototype) {
Both.prototype[key] = Second.prototype[key];
}
事实上,我需要更深入地了解方法:
class Final extends Both {
doIt() {
this.someMethod();
//this.doSmth(); // How to make this call threated as correct?
(this as any as IBoth).doSmth(); // That compiles, but it's awfull
}
}
如果在这种情况下方法在 class Both
中不可见,没关系。
我已经试过了:
写作时
class Both extends First implements IBoth {
typesctipt 说我还没有实现接口方法。
将
Both
重命名为_Both
并使用var Both = _Both as typeof _Both;
留下与原始代码相同的问题,因为
First
从未被提及。如果我将
Both
重命名为_Both
并写入var Both = _Both as typeof IBoth;
typescript 找不到
IBoth
.
还有其他方法可以到达吗?
您可以在 http://www.typescriptlang.org/Playground
试试
Full code there
添加此行和 运行 代码(将代码从右侧面板复制到浏览器控制台):
(new Final).doIt();
行 this.doSmth();
未注释时的输出:
constructor of Both
Second
someMethod from First
doSmth from Second
doSmth from Second
试试这个:
class Both extends First {
constructor() {...}
doSmth: typeof Second.prototype.doSmth;
}
最好将 Second
作为 class 而不是函数。如果是 javascript 模块,请添加声明文件。
最后,如果您不能为 Second
添加类型,只需像这样为每个函数添加类型:
class Both extends First {
constructor() {...}
doSmth: () => void;
}
不需要接口。只需要声明一个原型字段 via
doSmth: () => void
它作为一个 属性 可见,而不是作为一种方法,但没关系。
完整列表:
class First {
someMethod() {
console.log('someMethod from First');
}
}
function Second() {
console.log('Second');
}
Second.prototype.doSmth = function () {
console.log('doSmth from Second');
}
class Both extends First {
constructor() {
console.log('constructor of Both');
super();
Second.call(this);
}
doSmth: () => void
}
for (let key in Second.prototype) {
Both.prototype[key] = Second.prototype[key];
}
class Final extends Both {
doIt() {
this.someMethod();
this.doSmth();
//Both.prototype.doSmth(); // ok
//Final.prototype.doSmth(); // ok
}
}
PS:typescript class prototype variable
应该 google 而不是关于继承的不同组合。