所以我会修改我的代码如下......我收到一个错误是 VS Code,如下所示
普通对象没有 target 属性。
click 事件的事件对象的类型是 MouseEvent。 (您已标记jquery 和angular。如果您使用jQuery 或DOM 附加事件,它将是DOM 的MouseEvent。如果您使用Angular 附加事件,@987654324 @ 它也将是 DOM 的 MouseEvent。警告:我不使用 Angular。)您可能还想要 event.currentTarget.id 或 event.target.id 而不是使用 attributes 集合和 nodeValue,因为id 属性是一个反射属性。
但,DOM 的MouseEvent 接口从Event 继承其currentTarget 属性,它只是将其定义为EventTarget。你知道这将是一个Element,但不幸的是界面只是说它是EventTarget。 (target 也是如此。)
据我所知,MouseEvent 没有预定义的接口,将currentTarget 定义为Element。您可以可靠地(在这种情况下)使用类型断言:
onClick(event: MouseEvent) {
console.log((event.target as Element).id); // Or `(event.currentTarget as Element).id`
}
Playground link
我不喜欢类型断言,但它们有时是必要的。
有时你会看到人们做同样的断言略有不同,就像这样:
onClick({target}: {target: Element}) {
console.log(target.id);
}
// or
onClick({currentTarget}: {currentTarget: Element}) {
console.log(currentTarget.id);
}
Playground link
您可以创建一个可重用的类型,如下所示:
interface ElementMouseEvent extends MouseEvent {
currentTarget: Element;
target: Element;
}
...然后使用它(它仍然是一个断言,但同样是一个安全的断言):
onClick(event: ElementMouseEvent) {
console.log(event.target.id); // Or `event.currentTarget.id`
}
Playground link
如果你想去完全typesafe,你可以有一个类型断言函数,如果断言无效,它会抛出一个明确的运行时错误:
function assertIsElement(obj: object | null): asserts obj is Element {
if (!(obj instanceof Element)) {
throw new Error(`Object is not an Element instance`);
}
}
// ...
onClick({currentTarget}: MouseEvent) {
assertIsElement(currentTarget);
console.log(currentTarget.id);
}
Playground link
如果你控制onClick 的使用位置(例如,你知道你在Element 上使用它),那可能是矫枉过正。