类实现中的私有属性

时间:2016-09-10 03:57:38

标签: typescript

有一个接口实现:

interface ISome {
    some: Function;
}

class Awesome implements ISome {
    constructor(private some: Function) {}
}

这会触发错误:

  

很棒,错误地实现了接口ISome。财产'一些'属于私人类型' Awesome'但不是类型' ISome'。

但是不能将private添加到ISome,

private some: Function;

触发器

  

预期的财产或签名

应该如何对待它?

2 个答案:

答案 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.");
    }
}