2017-09-14 65 views
4

对于我的新小项目,我决定使用打字稿,原因不外乎让自己感觉像编程c在显着的类固醇上,显然我付出了代价。Typescript接口的实现对索引签名没有任何影响

我有一个接口,右侧

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

现在,我得到这个错误

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

在这line

 model[prop] = data[prop]; 

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

import DataObject from "./data-object"; 

export default class Model implements DataObject { 

    [key: string]: any; 

    ... 
} 

然后没有错误。

为什么界面签名对我的班不起作用?

回答

1

我觉得接口对实现没有影响。如果您将其更改为类并将其扩展,则会按预期工作。这是因为您可以通过其他方式实现索引,如属性,请参阅示例(在Playground中)。

interface DataObject { 
    foo: any; 
    bar: any; 
    [key: string]: any; 
}; 

class Model implements DataObject { 

    private _bar: string = null; 
    public get bar(): string { 
     return this._bar; 
    } 
    public set bar(value: string) { 
     this._bar = value; 
    } 

    constructor(data: DataObject = {}) { 
     this.foo = "bar"; // error 
     this.bar = "foo"; // no error 
     Model.fill(this, data); 
    } 

    static fill(model: Model, data: DataObject) { 
     for (let prop in data) { 
      model[prop] = data[prop]; // error 
     } 
    } 
} 

class DataObject2 { 
    foo: any; 
    bar: any; 
    [key: string]: any; 
}; 

class Model2 extends DataObject2 { 

    constructor(data: DataObject2 = { foo: "", bar: "" }) { 
     super(); 
     this.foo = "bar"; // no error 
     this.bar = "foo"; // no error 
     Model2.fill(this, data); 
    } 

    static fill(model: Model2, data: DataObject2) { 
     for (let prop in data) { 
      model[prop] = data[prop]; // no error 
     } 
    } 
} 
+0

但这是如何有意义?接口不应该能够首先定义属性,但是既然他们这样做,为什么这些类不会继承签名?没有价值? –

+0

他们没有定义。他们只是说“如果你实施我,就必须有财产”。只有语法看起来相同。在TypeScript中,你可以“实现”或“扩展”某些东西。类可以是“扩展”,接口(和类)可以​​是“实现”。 – Magu