2017-09-14 25 views
4

私の新しい小規模なプロジェクトでは、私は顕著なステロイドでプログラミングCのように感じるだけの理由でtypescriptと一緒に行くことに決めました。私はインターフェイスを持って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]; 
    } 
    } 
} 

それを実装しています行

 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

関連する問題