2016-06-30 7 views
1

をオブジェクトに追加することはできません。インターフェイスは、私は活字体1.8.10でオブジェクトリテラルにインターフェイスを追加しようとしていますが、動作していないようリテラル

interface TestInterface { 
    value: string 
} 

let references = { 
    interfaceReference: TestInterface 
} 

私は、コードをコンパイルする場合、コンパイラ直前に正しく指定されていますが、エラーCannot find name "TestInterface"がスローされます。私は、Angular 2プロジェクトの一部としてオブジェクトにインターフェイスを追加する必要があります。

私は抽象クラスとインターフェイスを交換した場合、すべてが動作するようです:

abstract class TestInterface { 
    value: string 
} 

let references = { 
    interfaceReference: TestInterface 
} 

しかしこれらの定義にインタフェースを使用することができるということはクリーンなコードになるでしょう。だから、私はこれを行う方法があることを願っています。

編集:私が何をしたいのか、なぜ私がインターフェイスを使用しているのかを明確にするために: 角度2には依存性注入メカニズムが含まれています。あなたは、ブートストラップコードでは、オブジェクトリテラルでの具体的なサービスの実装に抽象サービス定義からマッピングを指定することができます。

bootstrap(AppComponent, [ { provide: TestInterface, useClass: TestClass} ] 

活字体は、インターフェース

答えて

2

tsc文句の理由があることを再利用する可能性があるため、

interface SomeType { 
    interfaceReference: TestInterface 
} 

let references: SomeType = { 
    interfaceReference: null, 
}; 

を、interfacesはJavaScriptに変換されませんが、classesとなります。

あなたのコードでは、変数referencesにJavaScriptオブジェクトを割り当てています。

var TestInterface = (function() { 
    function TestInterface() { 
    } 
    return TestInterface; 
}()); 

実際にあなたの割り当てを作成するには:それはこのような変数としてtranspiledますので:後の値は、TestInterfaceがクラスであれば、働く値(例えば変数)、との表現でなければなりませんあなたは、なぜJavaScriptのオブジェクトを使用して起動するインタフェースを使用することについて熱心している場合、一方

let references: { interfaceReference: TestInterface } = { interfaceReference: null }; 

:あなたはこのような何かにそれをリライトする必要があり動作しますか?より良い方法は、次のように再びこれらの参照をカプセル化するために、次のようになります。

interface TestInterface { 
    value: string 
} 

class InterfaceReferences { 
    constructor(public interfaceReference: TestInterface) {} 
} 

let references: InterfaceReferences = new InterfaceReferences(testInterface); 
+0

あなたの答えは、私の特定のケースではTypeScriptの「制限」を示しているので、解答としてマークしています。さらに研究を重ねると、Angular 2はインタフェースをオブジェクト値として設定できないことを認識し、このような理由でOpaqueTokenを導入しました –

1
にオブジェクトのプロパティの値を設定することができない場合は、これは動作しません。

これは、タイプを定義する方法の方法です:まず、そう

interface TestInterface { 
    value: string 
} 

// firstly define type of the variable - next assign it value 
let references: { 
    interfaceReference: TestInterface 
} = { 
    interfaceReference: null, 
}; 

は - ":"た後、私たちは型を定義
第二 - "="は、我々はその値を定義した後

より良いインターフェースを作成することです:私たちはSomeType後で

1

あなたはインターフェースがJavaScriptにダウンしてコンパイルされていないとして、(実行時に存在しないTestInterfaceinterfaceReferenceの値を設定しようとしています)。

コロン(:)を使用して、タイプをreferencesに設定してから、値を設定する必要があります。

interface TestInterface { 
    value: string 
} 

let references: { 
    interfaceReference: TestInterface 
}; 

references.interfaceReference = { 
    value: "some value" 
};