2017-06-19 65 views
0

angular DI文檔具有下面的例子:<ClassName>在打字稿中執行鑄造嗎?

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

mockService現在HeroService一個實例?

這裏是萬一另一個代碼片段,有助於更清楚:

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

我認爲mockService有可能成爲HeroService實現或接口的實例,因爲HeroListComponent預計這種情況下它的構造。

+0

你是什麼意思的實例?如'prototype'實例中那樣?類型轉換對運行時間沒有影響 –

+0

使用更多代碼更新帖子 – Aravind

+0

TypeScript沒有「投射」。它有「類型斷言」。你斷言'{}'對象的類型是'HeroService'。如果斷言無法應用,則此類斷言將失敗 - 如果該值與斷言的類型不兼容。 'mockService'將被認爲是'HeroService'類型,但它不同於它是某個類'HeroService'的一個實例。 – 2017-06-19 17:24:29

回答

2

不,它不是HeroService的實例。
讓我們來看看一個簡單的例子:

class Point { 
    x: number; 
    y: number; 

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

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

這裏a不是Point一個實例,它只是有相同的成員,但如果你會做console.log(a.toString)你會得到[object Object]而不是(0, 0)

你可以在這裏閱讀更多關於此:Type assertions,也可能你想看看這個:Type Compatibility

+0

我認爲在類型轉換之後,編譯器把'a'視爲'Point'類的實例,並驗證它具有特定於Point類的方法。 'let a = {x:0,y:0,go(){}}; a.go();'提供了一個錯誤 - '屬性'go'在類型'Point'上不存在',儘管該方法存在於'a' –

+0

@Maximus這與其他語言沒有什麼不同,它只是多態。 –