【发布时间】:2016-02-05 00:26:13
【问题描述】:
具有以下类:
class Trait {
publicMethod() {
this.privateMethod();
// do something more
}
private privateMethod() {
// do something usefull
}
}
如果我尝试通过以下方式实现它:
class MyClass implements Trait {
publicMethod() {}
}
我收到以下错误:
MyClass 错误地实现了接口 Trait。财产 “MyClass”类型中缺少“privateMethod”
如果我尝试通过以下方式实现它:
class MyClass implements Trait {
publicMethod() {}
private privateMethod() {}
}
我收到以下错误:
MyClass 错误地实现了接口 Trait。类型有单独的 私有属性“privateMethod”的声明
如果我尝试以下操作:
class MyClass implements Trait {
publicMethod() {}
public privateMethod() {}
}
我收到错误:
MyClass 错误地实现了接口 Trait。财产 “privateMethod”在“Trait”类型中是私有的,但在“MyClass”类型中不是私有的
受保护的方法以及私有和受保护的属性也会发生同样的事情。因此,似乎要能够实现类,该类的所有成员都必须是公共的。
为什么在 TypeScript 中禁止实现具有非公共成员的类?
编辑: 好的,实现将类视为接口,并且因为接口不能具有私有成员,所以您不能实现具有非公共成员的类。但是为什么不忽略非公共成员呢?
提出这个问题是因为我想应用 mixins 来重用代码。另一种方法是组合,但是有一个使用 mixins 和非公共成员的解决方案。
解决办法如下:
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
derivedCtor.prototype[name] = baseCtor.prototype[name];
})
});
}
interface ITrait {
publicMethod();
}
class Trait implements ITrait {
publicMethod() {
this.privateMethod();
// do something more
}
private privateMethod() {
// do something usefull
}
}
class MyClass implements ITrait {
publicMethod() {}
}
applyMixins(MyClass, [Trait]);
【问题讨论】:
-
一个类
extends另一个类和implements一个接口。Trait是一个类,而不是一个接口 -
@BrunoGrieder 实际上,
implements用于 TypeScript 中的 mixins (typescriptlang.org/Handbook#mixins-mixin-sample) -
@MartinVseticka 好的。我的不好,我刚刚学到了一些东西。谢谢
标签: typescript