为什么在TypeScript中禁止实现具有非公共成员的类?

时间:2015-11-04 13:22:51

标签: typescript

拥有以下课程:

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]);

1 个答案:

答案 0 :(得分:4)

基本上,关键字implementsTrait类视为接口,接口不能具有私有方法。

在此处查看mixins背后的基本原理和私有方法:https://github.com/Microsoft/TypeScript/issues/5070

编辑:很容易发现mixin中私有方法的第一个问题以及不支持它们的原因。如果两个特征具有相同名称的私有方法怎么办?它们必须不会相互影响,但不能轻易完成(考虑instance['my' + 'method']()符号)。

来自TypeScript documentation on CodePlex

  

在上面你可能会注意到的第一件事是代替使用   '延伸'我们使用'实现'。这将类视为接口,   并且只使用Disposable和Activatable背后的类型而不是   实施。这意味着我们必须提供   在课堂上实施。除此之外,这正是我们想要避免的   通过使用mixins。