TypeScript类中的私有方法实现接口

时间:2017-06-05 19:19:20

标签: class typescript interface private implements

我有一个CPU约束的项目,有大量的类,我使用接口来最小化我在每个模块中使用的导入数量。但是,在实现各自接口的类上声明私有方法时,我遇到了一些问题。目前,我遇到了:

index.d.ts

interface IColony {
    // (other public properties)
    // instantiateVirtualComponents(): void;
}

Colony.ts

export class Colony implements IColony {
    // (constructor and other methods)
    private instantiateVirtualComponents(): void {
        // (implementation)
    }
}

问题是TypeScript似乎不允许我在这个类上声明私有属性。就是这样,tsc抱怨道:

Error:(398, 3) TS2322:Type 'IColony' is not assignable to type 'Colony'. Property 'instantiateVirtualComponents' is missing in type 'IColony'.

我很确定不应该在接口中声明私有属性和方法,但为了安全起见,如果我取消注释IColony中的方法声明,那么tsc会抱怨以下(在很多由此产生的其他错误):

Error:(10, 14) TS2420:Class 'Colony' incorrectly implements interface 'IColony'. Property 'instantiateVirtualComponents' is private in type 'Colony' but not in type 'IColony'.

我在这里做错了什么?你能不能在实现接口的类上声明私有成员吗?

作为参考,Colony.tshereindex.d.ts的相关部分为here

2 个答案:

答案 0 :(得分:0)

你可能正在做类似的事情:

function fn(): IColony { ... }

let a: Colony = fn(); // error: Type 'IColony' is not assignable to type 'Colony'...

发生此错误是因为您尝试将IColony的实例分配给Colony类型的变量,并且它不能以这种方式工作(仅限于其他方式)。

如果是这种情况那么它应该是:

let a: IColony = fn();

答案 1 :(得分:0)

这是因为

  

接口定义了“公共”合同,因此在接口上使用protectedprivate访问修饰符是没有意义的,更多的是实现细节。因此,您无法使用界面来完成您想要的事情。

另请参阅the original post