我正在尝试像类一样创建自己的 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);
}
}
我收到这个错误:
类型为“() => T[]”的属性“getValues”不可分配给字符串索引类型“T”
。
这可能吗? 如果是,我如何为我的类创建方法?
最佳答案
在进入TypeScript的时候遇到了一个很相似的事情。只是添加一个函数到一个类中就破坏了事情,更不用说实际调用该函数了。
“问题”似乎源于这样一个事实,即您基本上可以将类用作接口(interface)。在您的示例中,您可以毫无问题地执行以下操作。
let myobject: Dictionary<string>;
myobject = {'name': 'John'};
但是请注意,当您将对象声明为 Dictionary
类型时,它实际上并不是 Dictionary
类的实例,而只是一个常规的 javascript 对象。
将任何方法添加到 Dictionary
类都会导致原始错误。
我们的解决方案是注意何时拥有符合接口(interface)的对象,以及何时拥有类的实例。我上面的例子真的应该是...
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
类型?
此外,如果有人有关于将类用作接口(interface)的信息/文档/引用资料,或者我在该主题上大错特错,请告诉我!
关于实现类中的 typescript 索引签名和方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154433/