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

时间:2017-09-14 07:39:44

标签: typescript signature

对于我的新小项目,我决定使用打字稿,原因并不比让自己感觉像是在使用非凡的类固醇编程,而且显然我付出了代价。

我有一个界面,对吧

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];
    }
  }
}

现在我收到了这个错误

  

元素隐式具有“任何”类型,因为类型“模型”没有索引签名

在这一行

      model[prop] = data[prop];

但是如果我修改我的模型以包含签名

import DataObject from "./data-object";

export default class Model implements DataObject {

  [key: string]: any;

  ...
}

然后没有错误。

为什么界面签名对我的班级没有影响?

1 个答案:

答案 0 :(得分:1)

我认为界面不会对实施产生影响。如果将其更改为类并扩展它而不是按预期工作。那是因为您可以以其他方式实现索引,例如属性,请参阅示例(在Uncaught (in promise): Error: Cannot assign to a reference or variable!中)。

StudentsDetails = [];

  columns: string[] = [];

  constructor(private newService: StudentsService) { }

  ngOnInit() {
    this.newService.fetchData()
    .subscribe(responseStudentsDetails => {
      this.StudentsDetails = responseStudentsDetails;
      this.columns = Object.keys(this.StudentsDetails[0]);
    })
  };