2017-09-06 92 views
1

我正在將一些JavaScript轉換爲Typescript。setAttributeNS不會允許null

在下面的代碼中,null被拒絕,因爲它不能被分配給字符串參數。

var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 

svg.setAttributeNS(null, 'width', canvas.width.toString()); 
svg.setAttributeNS(null, 'height', canvas.height.toString()); 

檢查的svg類型,我們發現這是SVGSVGElement(是的,SVG的名字出現了兩次)。我試着明確地指定了一個類型svg: SVGElement,並能夠將創建的元素分配給它,但是對null問題沒有影響。

接受的答案Difference between setAttribute and setAttributeNS(null,說我必須當屬性沒有定義的命名空間時傳遞null。然後它建議我使用「一致性」setAttributeNS

但我不能傳遞null。我應該傳遞一個空字符串嗎?這會起作用嗎?還是應該使用DOM級別1 setAttribute方法?

+0

不回答問題的種類,但你不應該被指定命名空間是通過'http:// www.w3.org/2000/svg'? – GregHNZ

+0

@GregHNZ - 其實,沒有。在我連接的答案文本中有對此的討論。 –

+0

只需使用setAttribute即可。整體打字較少。 –

回答

0

如果文檔中說null是允許的,那麼這很像一個不幸的定義中的疏忽。

幸運的是,您可以輕鬆解決此問題。打字稿支持接口聲明合併,所以你可以重新聲明Element接口文件並添加缺少的方法:

var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 
interface Element { 
    setAttributeNS(namespaceURI: null, qualifiedName: string, value: string): void; 
} 
declare var canvas : HTMLCanvasElement; 

svg.setAttributeNS(null, 'width', canvas.width.toString()); 
svg.setAttributeNS(null, 'height', canvas.height.toString()); 
+0

我用過的很好的答案,除非因爲我是迂腐的'namespaceURI:string | null'也必須做到SVGSVGElement,並顯式鍵入'svg:SVGSVGElement' –

+0

併合並失敗隱藏其他方法,所以我最終宣佈了一個接口NSfix和鑄造調用'(svg as NSfix).setAttributeNS(null,。 ..)' –

+0

@PeterWone它隱藏了什麼方法?該接口應該在頂層進行聲明,而不是在任何名稱空間中進行聲明。從我的實驗中,所有的方法仍然存在。 –