4

我正在尝试创建自己的 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'.

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

4

1 回答 1

3

在进入 TypeScript 时遇到了非常相似的事情。只是向一个类添加一个函数就破坏了,更不用说实际调用该函数了。

“问题”似乎源于您基本上可以将类用作接口这一事实。在您的示例中,您可以毫无问题地执行以下操作。

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

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

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

此外,如果有人有关于使用类作为接口的信息/文档/参考,或者我在该主题上大错特错,请告诉我!

于 2018-06-11T18:37:11.370 回答