2017-06-19 5 views
0

angular DIマニュアルは、次の例があります。<ClassName>はtypescriptでキャストを実行しますか?

let mockService = <HeroService> {getHeroes:() => expectedHeroes } 

は今mockServiceHeroServiceのインスタンスですか?

ここ

はそれを明確に役立ちます場合は、別のコードスニペットです:

it('should have heroes when HeroListComponent created',() => { 
    let hlc = new HeroListComponent(mockService); 
    expect(hlc.heroes.length).toEqual(expectedHeroes.length); 
}); 

私はmockServiceHeroListComponentがそれコンストラクタこのような場合を想定しているため、HeroService実装やインタフェースのインスタンスでなければならないと思います。

+0

インスタンスによってはどういう意味ですか? 'prototype'インスタンスのように?タイプキャスティングはランタイムに影響しません –

+0

コードを追加して投稿を更新します – Aravind

+0

TypeScriptには「キャスト」がありません。それは "タイプアサーション"を持っています。 '{}'オブジェクトの型が 'HeroService'であると主張しています。アサーションが適用できない場合、アサーションが適用されない場合、アサーションがアサートされるタイプと互換性がない場合、アサーションは失敗します。 'mockService'は' HeroService'型であると見なされますが、それはそれがいくつかのクラス 'HeroService'のインスタンスであることとは別です。 –

答えて

2

いいえ、HeroServiceのインスタンスではありません。
は、簡単な例を見てみましょう。ここでは

class Point { 
    x: number; 
    y: number; 

    toString() { 
     return `(${this.x}, ${this.y})`; 
    } 
} 

let a = <Point>{ x: 0, y: 0 }; 

aはそれだけで同じメンバーを持っていますが、あなたは[object Object]代わりの(0, 0)を得るでしょうconsole.log(a.toString)やるならば、Pointのインスタンスではありません。

詳しくはType assertionsをご覧ください。Type Compatibilityもご覧ください。

+0

型キャスト後、コンパイラは 'a'を' Point'クラスのインスタンスのように扱い、Pointクラスに固有のメソッドを持っていることを検証します。 'let a = {x:0、y:0、go(){}}; a.go(); 'はエラーを返す - 'メソッド 'が' a 'に存在するにもかかわらず' go 'は型' Point 'には存在しない –

+0

@ Maximusこれは他の言語と違うわけではなく、ただ多態性です。 –

関連する問題