实现 class 中的 Typescript 索引签名和方法不起作用

Typescript Index Signature and methods in the implementing class doesn't work

我正在尝试创建自己的 Typescript 字典,例如 class,但在我的代码中使用了一些自定义方法。

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

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

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

这很好用……但是…… 如果我尝试在此 class 中创建一个方法,例如

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'.

这可能吗? 如果是,我如何为我的 class 创建方法?

在进入TypeScript时遇到了一个非常相似的事情。只是 添加 一个函数到 class 破坏了东西,没关系实际调用函数。

'problem' 似乎源于这样一个事实,即您基本上可以使用 class 作为接口。在您的示例中,您可以毫无问题地执行以下操作。

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

但是请注意,当您将对象声明为 Dictionary 类型时,它实际上并不是 Dictionary class 的实例,而只是一个常规 javascript 对象。

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

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

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

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

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

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

回到你原来的问题,我猜你是在声明 Dictionary 类型,而实际上它应该是 IDictionary?

此外,如果有人 information/documentation/references 使用 class 作为界面,或者我在该主题上大错特错,请告诉我!