拥有以下课程:
class Trait {
publicMethod() {
this.privateMethod();
// do something more
}
private privateMethod() {
// do something usefull
}
}
如果我尝试以下列方式实现它:
class MyClass implements Trait {
publicMethod() {}
}
我收到以下错误:
MyClass非常实现接口Trait。属性 ' privateMethod'类型' MyClass
中缺少
如果我尝试以下列方式实现它:
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]);
答案 0 :(得分:4)
基本上,关键字implements
将Trait
类视为接口,接口不能具有私有方法。
在此处查看mixins背后的基本原理和私有方法:https://github.com/Microsoft/TypeScript/issues/5070
编辑:很容易发现mixin中私有方法的第一个问题以及不支持它们的原因。如果两个特征具有相同名称的私有方法怎么办?它们必须不会相互影响,但不能轻易完成(考虑instance['my' + 'method']()
符号)。
来自TypeScript documentation on CodePlex:
在上面你可能会注意到的第一件事是代替使用 '延伸'我们使用'实现'。这将类视为接口, 并且只使用Disposable和Activatable背后的类型而不是 实施。这意味着我们必须提供 在课堂上实施。除此之外,这正是我们想要避免的 通过使用mixins。