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 HTMLElementRespuestas:
No hereda de
Elementporque no todos los destinos de eventos son elementos.De MDN :
Incluso el
KeyboardEventque 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.targetdefinirlo 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 esaEventTargetes una interfaz más abstracta queElement.Más información: https://typescript.codeplex.com/discussions/432211
fuente
KeyboardEvents 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.targetun tipo que sea más específico queEventTarget, a menos que piensesKeyboardEventque 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.valuepropiedad 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?assintaxis se introdujo porque entraba en conflicto con JSX. Se recomienda usaraspara 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