Simplemente quiero hacer esto con mi KeyboardEvent
var tag = evt.target.tagName.toLowerCase();
Si bien Event.target es de tipo EventTarget, no hereda de Element. Así que tengo que lanzarlo así:
var tag = (<Element>evt.target).tagName.toLowerCase();
Esto probablemente se deba a que algunos navegadores no siguen los estándares, ¿verdad? ¿Cuál es la implementación independiente del navegador correcta en TypeScript?
PD: Estoy usando jQuery para capturar KeyboardEvent.
typescript
daniel.sedlacek
fuente
fuente
var element = ev.target as HTMLElement
Respuestas:
No hereda de
Element
porque no todos los destinos de eventos son elementos.De MDN :
Incluso el
KeyboardEvent
que está intentando usar puede ocurrir en un elemento DOM o en el objeto de la ventana (y teóricamente en otras cosas), por lo que no tendría sentidoevt.target
definirlo como unElement
.Si es un evento en un elemento DOM, entonces diría que puede asumir con seguridad
evt.target
. es unElement
. No creo que esto sea una cuestión de comportamiento entre navegadores. Simplemente esaEventTarget
es una interfaz más abstracta queElement
.Más información: https://typescript.codeplex.com/discussions/432211
fuente
KeyboardEvent
s puede ocurrir tanto en elementos DOM como en el objeto de la ventana (y teóricamente otras cosas), así que ahí mismo es imposible darKeyboardEvent.target
un tipo que sea más específico queEventTarget
, a menos que piensesKeyboardEvent
que también debería ser un tipo genéricoKeyboardEvent<T extends EventTarget>
y me gustaría verse obligado a ponerKeyboardEvent<Element>
todo en su código. En ese punto, es mejor hacer el yeso explícito, por doloroso que pueda ser.value
propiedad de una<select>
etiqueta. por ejemplolet target = <HTMLSelectElement> evt.target;
Usando mecanografiado, uso una interfaz personalizada que solo se aplica a mi función. Caso de uso de ejemplo.
En este caso, handleChange recibirá un objeto con un campo de destino que es de tipo HTMLInputElement.
Más adelante en mi código puedo usar
Un enfoque más limpio sería poner la interfaz en un archivo separado.
luego use la siguiente definición de función:
En mi caso de uso, se define expresamente que la única persona que llama para manejar el cambio es un tipo de elemento HTML de texto de entrada.
fuente
handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement> & { target: HTMLInputElement }) => {...}
La respuesta de JLRishe es correcta, así que simplemente uso esto en mi controlador de eventos:
fuente
Texto mecanografiado 3.2.4
Para recuperar la propiedad, debe convertir el objetivo al tipo de datos apropiado:
fuente
<HTMLInputElement>event.target;
sintaxis?as
sintaxis se introdujo porque entraba en conflicto con JSX. Se recomienda usaras
para mantener la consistencia. basarat.gitbooks.io/typescript/docs/types/type-assertion.html¿Podría crear su propia interfaz genérica que se extienda
Event
. ¿Algo como esto?Entonces puedes usarlo como:
fuente
Con mecanografiado podemos aprovechar los alias de tipo, así:
fuente
@Bangonkali proporciona la respuesta correcta, pero esta sintaxis parece más legible y más agradable para mí:
fuente