“HTMLElement”types的值不存在属性“值”
我正在打字打字,并试图创build一个脚本,将更新一个p元素作为文本input框中input。
该html看起来如下所示:
<html> <head> </head> <body> <p id="greet"></p> <form> <input id="name" type="text" name="name" value="" onkeyup="greet('name')" /> </form> </body> <script src="greeter.js"></script> </html>
和greeter.ts
文件:
function greeter(person) { return "Hello, " + person; } function greet(elementId) { var inputValue = document.getElementById(elementId).value; if (inputValue.trim() == "") inputValue = "World"; document.getElementById("greet").innerText = greeter(inputValue); }
当我与tsc
编译时,我得到以下“错误”:
/home/bjarkef/sandbox/greeter.ts(8,53): The property 'value' does not exist on value of type 'HTMLElement'
然而编译器确实输出了一个javascript文件,在chrome中工作得很好。
我怎么得到这个错误? 我该如何解决?
此外,我可以在哪里查找哪些属性在'HTMLElement'
根据打字稿有效?
请注意,我对JavaScript和打字稿很新,所以我可能会漏掉一些明显的东西。 🙂
基于Tomasz Nurkiewiczs的回答,“问题”是打字稿是types安全的。 :)所以document.getElementById()
返回不包含value
属性的HTMLElement
types。 子typesHTMLInputElement
不包含value
属性。
所以一个解决scheme是将getElementById()
的结果投射到HTMLInputElement
如下所示:
var inputValue = (<HTMLInputElement>document.getElementById(elementId)).value;
在打字稿中是铸造操作员。 看到问题的TypeScript:铸造HTMLElement 。
从上面的行产生的JavaScript看起来像这样:
inputValue = (document.getElementById(elementId)).value;
即不包含types信息。
尝试将您想要更新的元素转换为HTMLInputElement。 正如其他答案中所述,您需要向编译器提示这是一个特定types的HTMLElement:
var inputElement = <HTMLInputElement>document.getElementById('greet'); inputElement.value = greeter(inputValue);
问题在这里:
document.getElementById(elementId).value
你知道从getElementById()
返回的HTMLElement
实际上是一个HTMLInputElement
的实例,它inheritance于它,因为你正在传入一个input元素的ID。 类似的静态types的Java,这将不会编译:
public Object foo() { return 42; } foo().signum();
signum()
是Integer
一个方法,但编译器只知道foo()
的静态types,即Object
。 而Object
没有signum()
方法。
但是编译器无法知道,它只能基于静态types,而不是dynamic的代码行为。 就编译器所知, document.getElementById(elementId)
expression式的types没有value
属性。 只有input元素才有价值。
对于MDN中的引用检查HTMLElement
和HTMLInputElement
。 我认为Typescript或多或less与这些一致。
这个快速解决方法是使用[]来select属性。
function greet(elementId) { var inputValue = document.getElementById(elementId)["value"]; if(inputValue.trim() == "") { inputValue = "World"; } document.getElementById("greet").innerText = greeter(inputValue); }
我只是尝试一些方法,找出这个解决scheme,
我不知道原始脚本背后有什么问题。
作为参考,你可以参考Tomasz Nurkiewicz的post。
如果你正在使用反应,你可以使用as
运算符。
let inputValue = (document.getElementById(elementId) as HTMLInputElement).value;
问题:
错误属性“文本”不存在types“HTMLElement”
解决scheme:在typeScript中,我们需要投射document.getElementById()
,它返回< HTMLScriptElement >
HTMLElement
types
所以我们可以通过按照下面的方式来解决错误,正如所期望的typescript.js
Code: var content: string = ( < HTMLScriptElement > document.getElementById(contentId)).text;
它为我工作..希望它也适用于你。