¿Alguien sabe cómo transmitir en TypeScript?
Estoy tratando de hacer esto:
var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);
pero me está dando un error:
Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList
No puedo acceder al miembro 'tipo' del elemento de script a menos que lo convierta al tipo correcto, pero no sé cómo hacerlo. Busqué en los documentos y muestras, pero no pude encontrar nada.
typescript
Spongman
fuente
fuente
Respuestas:
TypeScript usa '<>' para rodear los lanzamientos, por lo que lo anterior se convierte en:
Sin embargo, desafortunadamente no puedes hacer:
Obtienes el error
Pero puedes hacer:
fuente
(<NodeListOf<HTMLScriptElement>>document.getElementsByName(id))[0];
A partir de TypeScript 0.9, el
lib.d.ts
archivo utiliza firmas especializadas de sobrecarga que devuelven los tipos correctos para las llamadasgetElementsByTagName
.Esto significa que ya no necesita usar aserciones de tipo para cambiar el tipo:
fuente
Siempre puedes hackear el sistema de tipos usando:
fuente
No escriba cast. Nunca. Use guardias tipo:
Deje que el compilador haga el trabajo por usted y obtenga errores cuando sus suposiciones resulten incorrectas.
Puede parecer excesivo en este caso, pero te ayudará mucho si vuelves más tarde y cambias el selector, como agregar una clase que falta en el dom, por ejemplo.
fuente
Para terminar con:
Array
objeto real (no unNodeList
disfrazado como unArray
)HTMLElements
, noNode
forzada aHTMLElement
sPrueba esto:
Disfrutar.
fuente
Podríamos escribir nuestra variable con un tipo de retorno explícito :
O afirmar como (necesario con TSX ):
O, en casos más simples, afirmar con sintaxis de paréntesis angular .
Documentación:
TypeScript - Tipos básicos - Aserciones de tipo
fuente
Solo para aclarar, esto es correcto.
como
NodeList
no es una matriz real (por ejemplo, que no contiene.forEach
,.slice
,.push
, etc ...).Por lo tanto, si se convirtió
HTMLScriptElement[]
en el sistema de tipos, no obtendría errores de tipo si intentara llamar a losArray.prototype
miembros en el momento de la compilación, pero fallaría en el tiempo de ejecución.fuente
Esto parece resolver el problema, utilizando el
[index: TYPE]
tipo de acceso a matriz, saludos.fuente
Podría resolverse en el archivo de declaración (lib.d.ts) si TypeScript definiría HTMLCollection en lugar de NodeList como un tipo de retorno.
DOM4 también especifica esto como el tipo de retorno correcto, pero las especificaciones DOM más antiguas son menos claras.
Ver también http://typescript.codeplex.com/workitem/252
fuente
Dado que es un
NodeList
, no unArray
, realmente no deberías usar corchetes o lanzarArray
. La forma de propiedad para obtener el primer nodo es:Puedes lanzar eso:
O extienda
NodeList
:fuente
const script = document.getElementsByName(id).item(0) as HTMLScriptElement;
También recomendaría las guías del sitio.
https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (ver a continuación) y https://www.sitepen.com/blog/2014/08/22/advanced -typescript-concepts-classes-types /
fuente
fuente