Typescript接口实现对索引签名没有影响

Typescript接口实现对索引签名没有影响,typescript,signature,Typescript,Signature,对于我的新小项目,我决定使用typescript的原因并不比让自己感觉自己像是在用非凡的类固醇编写c语言更好,显然我正在为此付出代价 我有一个接口,对吗 export default interface DataObject { [key: string]: any }; 这应该允许我用字符串键和任何值定义对象。然后我在实施它 import DataObject from "./data-object"; export default class Model implements Dat

对于我的新小项目,我决定使用typescript的原因并不比让自己感觉自己像是在用非凡的类固醇编写c语言更好,显然我正在为此付出代价

我有一个接口,对吗

export default interface DataObject {
  [key: string]: any
};
这应该允许我用字符串键和任何值定义对象。然后我在实施它

import DataObject from "./data-object";

export default class Model implements DataObject {

  constructor(data: DataObject = {}) {
    Model.fill(this, data);
  }

  static fill(model: Model, data: DataObject) {
    for (let prop in data) {
      model[prop] = data[prop];
    }
  }
}
现在我得到了这个错误

元素隐式具有“any”类型,因为类型“Model”没有索引签名

import DataObject from "./data-object";

export default class Model implements DataObject {

  [key: string]: any;

  ...
}
在这条线上

      model[prop] = data[prop];
但是如果我修改我的模型以包含签名

import DataObject from "./data-object";

export default class Model implements DataObject {

  [key: string]: any;

  ...
}
那么就没有错误了


为什么接口签名对我的类没有影响?

我认为接口对实现没有影响。如果您将其更改为类并对其进行扩展,使其超出预期效果。这是因为您可以用另一种方式实现索引,如属性,请参见示例(中)


但这有什么意义呢?接口本来不应该能够定义属性,但既然它们能够定义属性,为什么类不继承签名呢?没有价值?他们没有定义。他们只是说“如果你实施我,就必须有一个财产”。只有语法看起来相同。在TypeScript中,您可以“实现”或“扩展”某些内容。类可以是“扩展”,接口(和类)可以是“实现”。