实现 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 作为界面,或者我在该主题上大错特错,请告诉我!
我正在尝试创建自己的 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 作为界面,或者我在该主题上大错特错,请告诉我!