我有这样的代码:
<select class="form-control" on:change={pathChanged}>
pathChanged
的签名为:
function pathChanged(event: { target: HTMLSelectElement }) {
当我使用npm run check
通过tsc
运行时,我得到这个错误:
Error: Type '(event: { target: HTMLSelectElement; }) => void' is not assignable to type 'FormEventHandler<HTMLSelectElement>'.
Types of parameters 'event' and 'event' are incompatible.
Type 'Event & { currentTarget: EventTarget & HTMLSelectElement; }' is not assignable to type '{ target: HTMLSelectElement; }'.
Types of property 'target' are incompatible.
Type 'EventTarget | null' is not assignable to type 'HTMLSelectElement'.
Type 'null' is not assignable to type 'HTMLSelectElement'. (ts)
<select class="form-control" on:change={pathChanged}>
pathChanged
应该有什么特征?
事件target
比您希望的更不具体1。在这种情况下,我通常在函数中使用类型断言来解决这个问题。
function pathChanged(event: Event) {
const target = event.target as HTMLSelectElement;
// ...
}
虽然错误说明currentTarget
应该正确输入,所以使用它应该也可以:
function pathChanged(event: { currentTarget: HTMLSelectElement })
如果事件具有比Event
更具体的类型,例如MouseEvent
,则可以使用&
将这些类型组合起来:
function onMouseUp(event: MouseEvent & { currentTarget: HTMLSelectElement })
1这样做的原因是大多数事件冒泡和target
通常可以是元素中带有处理程序的任何元素。currentTarget
总是引用带有处理程序的元素,因此可以确定地键入。
我设置了一个输入类型为file
:
// added this interface
interface FormEventHandler<T> {
target: EventTarget | null;
}
// then in the function
const onChangeFile = async (event: FormEventHandler<HTMLInputElement>) => {
const target = event.target as HTMLInputElement;
// your code
}