结合Nitzan和Edwin的答案,我发现这样的事情对我有用:
update = (e: React.FormEvent<EventTarget>): void => { let target = e.target as HTMLInputElement; this.props.login[target.name] = target.value; }
该 SyntheticEvent 接口是通用的:
interface SyntheticEvent<T> { ... currentTarget: EventTarget & T; ... }
而且 currentTarget 是泛型约束和。的交集 EventTarget 。 此外,由于您的事件是由输入元素引起的,您应该使用 FormEvent ( 在定义文件中 , 反应文件 )。
currentTarget
EventTarget
FormEvent
应该:
update = (e: React.FormEvent<HTMLInputElement>): void => { this.props.login[e.currentTarget.name] = e.currentTarget.value }
问题不在于Event类型,而是typescript中的EventTarget接口只有3个方法:
interface EventTarget { addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; dispatchEvent(evt: Event): boolean; removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; } interface SyntheticEvent { bubbles: boolean; cancelable: boolean; currentTarget: EventTarget; defaultPrevented: boolean; eventPhase: number; isTrusted: boolean; nativeEvent: Event; preventDefault(): void; stopPropagation(): void; target: EventTarget; timeStamp: Date; type: string; }
所以这是正确的 name 和 value 在EventTarget上不存在。您需要做的是将目标强制转换为具有所需属性的特定元素类型。在这种情况下它将是 HTMLInputElement 。
name
value
HTMLInputElement
update = (e: React.SyntheticEvent): void => { let target = e.target as HTMLInputElement; this.props.login[target.name] = target.value; }
对于事件而不是React.SyntheticEvent,您也可以按如下方式键入它们: Event , MouseEvent , KeyboardEvent ......等等,取决于处理程序的用例。
Event
MouseEvent
KeyboardEvent
查看所有这些类型定义的最佳方法是从两个打字稿和&amp ;;中检出.d.ts文件。反应。
另请查看以下链接以获取更多解释: 为什么Event.target不是Typescript中的元素?
我认为最简单的方法是:
type InputEvent = React.ChangeEvent<HTMLInputElement>; type ButtonEvent = React.MouseEvent<HTMLButtonElement>; update = (e: InputEvent): void => this.props.login[e.target.name] = e.target.value; submit = (e: ButtonEvent): void => { this.props.login.logIn(); e.preventDefault(); }