Estoy jugando con el mecanografiado y estoy tratando de crear un script que actualice un elemento p a medida que el texto se ingresa en un cuadro de entrada.
El html tiene el siguiente aspecto:
<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>
Y el greeter.ts
archivo:
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);
}
Cuando compilo con tsc
me sale el siguiente "error":
/home/bjarkef/sandbox/greeter.ts(8,53): The property 'value' does not exist on value of type 'HTMLElement'
Sin embargo, el compilador genera un archivo javascript, que funciona bien en Chrome.
¿Cómo es que obtengo este error? ¿Y cómo puedo arreglarlo?
Además, ¿dónde puedo buscar qué propiedades son válidas en un 'HTMLElement'
mecanografiado según?
Tenga en cuenta que soy muy nuevo en javascript y mecanografiado, por lo que es posible que me falte algo obvio. :)
fuente
Si está utilizando react, puede usar el
as
operador.fuente
<>
operadores para emitir, ya que estos se usan en React. Entonces debe usarlo como: basarat.gitbooks.io/typescript/docs/types/…Intente transmitir el elemento que desea actualizar a HTMLInputElement. Como se indicó en las otras respuestas, debe insinuarle al compilador que este es un tipo específico de elemento HTMLE:
fuente
Ejemplo actualizado:
Documentación de Typecriptlang:
TypeScript - Tipos básicos - Aserciones de tipo
fuente
Una solución rápida para esto es usar [] para seleccionar el atributo.
Solo pruebo algunos métodos y descubro esta solución,
no sé cuál es el problema detrás de su script original.
Como referencia, puede consultar la publicación de Tomasz Nurkiewicz.
fuente
El problema está aquí:
Sabes que
HTMLElement
devueltogetElementById()
es en realidad una instancia deHTMLInputElement
heredar de él porque estás pasando una ID del elemento de entrada. Del mismo modo, en Java estáticamente tipado, esto no compilará:signum()
es un método deInteger
, pero el compilador solo conoce el tipo estático defoo()
, que esObject
. YObject
no tiene unsignum()
método.Pero el compilador no puede saber eso, solo puede basarse en tipos estáticos, no en el comportamiento dinámico de su código. Y hasta donde el compilador sabe, el tipo de
document.getElementById(elementId)
expresión no tienevalue
propiedad. Solo los elementos de entrada tienen valor.Para una consulta de referencia
HTMLElement
yHTMLInputElement
en MDN. Supongo que Typecript es más o menos consistente con estos.fuente
.value
en el elemento p, estoy accediendo a él en elinput
elemento. ¿O me equivoco?document.getElementById("greet")
y tienes<p id="greet"></p>
...document.getElementById("greet").innerText
que debe ser perfectamente válido, solo estoy accediendo a lavalue
propiedad en el elemento de entrada en la línea que contiene:var inputValue = document.getElementById(elementId).value;
ingreet(elementId)
y que se llama en el htmlonkeyup="greet('name')"
en el formulario de entrada. Así que creo que está leyendo mal el código, corríjame si me equivoco. :)getElementById
y cómo lo hago en mecanografiado? ¿O hay otro método que elgetElementById
que devuelveHTMLInputElement
?También para cualquier persona que use propiedades como accesorios o referencias sin sus "DocgetId's", entonces puede:
Donde las comillas invertidas es el valor de sus accesorios, un ejemplo sería así:
fuente
Si está usando angular, puede usar:
fuente
Este trabajo para mi:
fuente
Problema:
Solución: a máquina de escribir necesitamos fundido
document.getElementById()
que devuelve el tipoHTMLElement
de< HTMLScriptElement >
Por lo tanto, podemos hacerlo de la siguiente manera para resolver el error como se esperaba por typescript.js
Funcionó para mí ... espero que funcione para ti también.
fuente