打字稿索引签名和实现类中的方法不起作用

时间:2017-11-07 09:39:11

标签: typescript dictionary generics index-signature

我试图像类一样创建自己的Typescript字典,但是在我的代码中使用了一些自定义方法。

我可以像这样创建基本词典:

export interface IDictionary<T> {
 [property: string]: T;
};

export class Dictionary<T> implements IDictionary<T> {
 [property: string]: T;
 constructor() {}
}

这很有效......但...... 如果我尝试在这个类中创建一个方法,比如

export class Dictionary<T> implements IDictionary<T> {
 [property: string]: T;
 constructor() {}

 public getValues(): T[] { // this will give the error
    return Object.values(this);
 }
}  

我收到此错误:

Property 'getValues' of type '() => T[]' is not assignable to string index type 'T'

这甚至可能吗? 如果是,我该如何为我的班级创建方法?

1 个答案:

答案 0 :(得分:2)

进入TypeScript时遇到了类似的事情。只是向一个类添加一个函数就会破坏事物,实际上并没有调用该函数。

问题&#39;似乎是因为你基本上可以使用一个类作为接口。在您的示例中,您可以毫无问题地执行以下操作。

let myobject: Dictionary<string>;
myobject = {'name': 'John'};

但请注意,当您声明对象属于Dictionary类型时,它实际上并不是Dictionary类的实例,而只是一个常规的javascript对象。< / p>

Dictionary类添加任何方法都会导致原始错误。

我们的解决方案是要注意何时有一个符合接口的对象,以及何时有一个类的实例。我上面的例子应该是......

let myobject: IDictionary<string>;
myobject = {'name': 'John'};

如果我想说一个方法添加到Dictionary类并使用它,我需要一个Dictionary对象

let myobject: IDictionary<string>;
myobject = {'name': 'John'};

let myinstance: Dictionary<string>;
myinstance = new Dictionary(myobject);
myinstance.getValues();

回到原来的问题,当我真的应该使用Dictionary类型时,我猜你会宣布IDictionary类型的某些内容吗?

此外,如果有人有关于使用课程作为界面的信息/文档/参考资料,或者我对该主题严重错误,请告诉我们!