我正在玩打字稿,我正在尝试创建一个脚本,在输入框中输入文本时将更新p元素 .
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
编译时,我得到以下"error":
/home/bjarkef/sandbox/greeter.ts(8,53): The property 'value' does not exist on value of type 'HTMLElement'
但是编译器确实输出了一个javascript文件,它在chrome中运行得很好 .
How come I get this error? And how can I fix it?
另外,根据打字稿,我在哪里可以查找哪些属性在 'HTMLElement'
上有效?
请注意我对javascript和打字稿很新,所以我可能会遗漏一些明显的东西 . :)
8 回答
快速解决此问题的方法是使用[]选择属性 .
我只是尝试了几种方法并找到了这个解决方案,
我不知道原始脚本背后的问题 .
供参考,您可以参考Tomasz Nurkiewicz的帖子 .
对于使用Props或Refs等属性而没有“DocgetId”的人,您可以:
倒置引号是你的道具值,所以一个例子就是这样:
根据Tomasz Nurkiewiczs的回答,"problem"是打字稿是类型安全的 . :)所以
document.getElementById()
返回的类型HTMLElement
不包含value
属性 . 但是,子类型HTMLInputElement
包含value
属性 .所以解决方案是将
getElementById()
的结果转换为HTMLInputElement
,如下所示:<>
是打字稿中的转换操作符 . 请参阅问题TypeScript: casting HTMLElement .上面的行中生成的javascript如下所示:
即不包含类型信息 .
尝试将要更新的元素强制转换为HTMLInputElement . 如其他答案中所述,您需要向编译器提示这是特定类型的HTMLElement:
如果您正在使用react,则可以使用
as
运算符 .问题出在这里:
您知道从
getElementById()
返回的HTMLElement
实际上是从它继承的HTMLInputElement
的实例,因为您传递的是输入元素的ID . 类似地,在静态类型的Java中,这将无法编译:signum()
是Integer
的方法,但编译器只知道foo()
的静态类型,即Object
. 并且Object
没有signum()
方法 .但编译器无法知道,它只能基于静态类型,而不能基于代码的动态行为 . 就编译器所知,
document.getElementById(elementId)
表达式的类型没有value
属性 . 只有输入元素才有 Value .有关参考,请在MDN中检查HTMLElement和HTMLInputElement . 我认为Typescript或多或少与这些一致 .
更新示例:
文档:
TypeScript - Basic Types - Type assertions
问题:
解决方案:在typeScript中我们需要转换
document.getElementById()
,它在< HTMLScriptElement >
中返回HTMLElement
类型所以我们可以按照以下方式解决错误 typescript.js
它对我有用..希望它也适合你 .