2017-09-06 58 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它隐藏了什么方法?该接口应该在顶层进行声明,而不是在任何名称空间中进行声明。从我的实验中,所有的方法仍然存在。 –