2016-05-29 224 views
0

我怕我不知道如果這是一個問題,關於WebStormAngular2打字稿錯誤分配變量類型

我有一個Angular2籌建成立和正在使用WebStorm 2016年1月2日與編輯。我的一個部件的使用變得簡單document.getElementById('some-el');到DOM元素的引用,並將此向服務方法:

calc(el:HTMLElement){ 
    this.height = el.offsetHeight; 
    this.width = el.offsetWidth; 

    let span:HTMLElement = el.querySelector("span"); 
    this.pos = span.offsetTop - span.offsetHeight; 
} 

一切正常,我沒有在瀏覽器中得到任何錯誤,但我得到一個錯誤在WebStorm掛el.querySelector("span");

錯誤說:Initializer type Element is not assignable to variable type HTMLElement

我不知道這是否與WebStorm了問題,如果我確實打字錯誤的東西。如果我設置的span類型Element錯誤消失但隨後的offsetTopoffsetHeight突出是不正確的?

由於實際建設似乎並沒有遭受當我運行它,我只是想知道,如果這東西在我的代碼需要修復或東西在我的編輯,我可以忽略?

乾杯您的幫助

+0

https://github.com/cloud9ide/typescript/blob/master/typings/lib.d.ts#L2410 – haim770

回答

2

你只需要投它:

calc(el:HTMLElement){ 
    this.height = el.offsetHeight; 
    this.width = el.offsetWidth; 

    let span:HTMLElement = <HTMLElement> el.querySelector("span"); 
    this.pos = span.offsetTop - span.offsetHeight; 
} 

或者你可以使用type assertion

let span:HTMLElement = el.querySelector("span") as HTMLElement; 

什麼情況是,querySelector回報Element而不是HTMLElement爲你宣稱span的類型爲。但是你可以告訴編譯器「相信你」,你知道它確實是一個HTMLElement

您還可以使用HTMLSpanElement代替HTMLElement這是更具體的,就像HTMLElementElement更具體的(這就是爲什麼當你把它改爲ElementoffsetTopoffsetHeight是不可用)。

+0

現在我覺得自己很蠢。多年來我一直是Flash開發人員,而這正是您在AS3中所做的。好吧,生活和學習。感謝您指出了這一點:) – popClingwrap

+3

' obj'和'OBJ時HTMLElement'是_both_類型的斷言,有作爲打字稿一個類型_cast_沒有這樣的事情。另外,AFAIK,後者現在是首選語法,因爲前者在'.tsx'上下文中不明確。 –

+0

@JohnWhite很高興知道,並沒有意識到這一點 –