有一个接口实现:
interface ISome {
some: Function;
}
class Awesome implements ISome {
constructor(private some: Function) {}
}
这会触发错误:
很棒,错误地实现了接口ISome。财产'一些'属于私人类型' Awesome'但不是类型' ISome'。
但是不能将private
添加到ISome,
private some: Function;
触发器
预期的财产或签名
应该如何对待它?
答案 0 :(得分:1)
应该如何对待它?
我会通过质疑意图和/或一些假设来说。
很棒,错误地实现了接口ISome。属性'some'在'Awesome'类型中是私有的,但在'ISome'类型中不是。
私有属性不能用作接口的实现。 Private
表示它不能在课堂外访问,所以如果你有
class Awesome {
private some: Function
}
您无法将该类的实例传递给
function doSomething(awesome: {some: Function}) { ... }
因为它无法获得Awesome中私有的some
。
从另一方面来看,如果你希望some
是私有的,那么在界面中公开它有什么意义呢?私有属性在声明它的类型之外是不可访问的,但是接口中没有任何东西可以访问它 - 接口是契约,它不包含任何实现。
界面的意图是什么?为了确保特定的班级有特定的私人财产?但是如何在课堂上私人实施还不够?
或者,是否有私人实施支持的公共财产?那就足够了:
interface ISome {
some: Function;
}
class Awesome implements ISome {
public some: Function;
constructor(private someImpl: Function) {
this.some = someImpl
}
}
答案 1 :(得分:0)
如果您只需要通过扩展类使给定方法“不可覆盖”,则可以向类的构造函数添加一些断言代码,以验证尚未针对新实例修改方法。
这不是理想的(例如,它是运行时而不是编译时),但它是我所知道的下一个最好的东西。
示例:
function HasSealedProps(target: Object) {
let oldConstructor = target.constructor;
target.constructor = function() {
for (let key in target["prototype"]) {
let method = target["prototype"][key];
if (method.sealed) {
console.assert(this[key] == method, `Cannot override sealed method "${key}".`);
}
}
return oldConstructor.apply(this, arguments);
};
}
function Sealed(target: Object, key: string) {
target[key].sealed = true;
}
interface MyInterface {
DoNotOverrideMe: Function;
}
@HasSealedProps
class MyClass implements MyInterface {
@Sealed DoNotOverrideMe() {
console.log("I shall always exist. No one shall take my place.");
}
}