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

标签 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);
 }
}  

我收到这个错误:

类型为“() => 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/

相关文章:

java - 如何反转 @ManyToMany JPA 关系一侧的键值映射类型

generics - 为什么选择在 Dart 中输入?

java - 为什么一个地方的原始类型会导致其他地方的通用调用站点被视为原始类型?

typescript - 如何让 gulp-typescript 显示错误?

typescript - Vue TSX - 如何告诉 Typescript 在可重用组件中允许使用 HTML 属性?

angular - 使用 RxJS 获取 "is not a function "错误

java - 适用于 Android 的内存友好快速键值访问解决方案

android - 如何搜索单词定义?

C# 泛型类型导致歧义

amazon-web-services - 如何运行我的 CDK 应用程序?