Typescript: 请求在lib.d.ts的事件接口中更改currentTarget

创建于 2014-07-29  ·  36评论  ·  资料来源: microsoft/TypeScript

当使用lib.d.ts中的Event接口并附加一个侦听器时,回调将获得Event类型的对象。 但是,事件的currentTarget属性的类型为EventTarget(而应为Element / HTMLElement类型)。

lib.d.ts Suggestion help wanted

最有用的评论

我在JS FileReader onload遇到了这个TS2339: Property 'result' does not exist on type 'EventTarget' ,并在传递给FileReader的onerror的事件中再次警告getSummary() onerror

我的解决方法是消除可怕的红色蠕变线条;-)如下:

interface FileReaderEventTarget extends EventTarget {
    result:string
}

interface FileReaderEvent extends Event {
    target: FileReaderEventTarget;
    getMessage():string;
}

然后在我的应用程序中:

reader.onload = function(fre:FileReaderEvent) {
        var data = JSON.parse(fre.target.result);
        ...
    }

生成的JS代码看起来不错,并且对我有用。 是否可以将针对非常规JS事件类型的这种解决方案添加到lib.d.ts中?

我猜我的解决方案过于简单。 但这有助于了解原因。

所有36条评论

XMLHttpRequest对象也可以是currentTarget,但不是Element / HTMLElement。 也许这就是背后的原因。 泛型会改善这一点吗?

interface Event<T extends EventTarget> {
    /* ... */
    currentTarget: T;
    /* ... */
}

interface EventListener<T extends EventTarget> {
    (evt: Event<T>): void;
}

interface HTMLElement {
    /* ... */
    addEventListener(type: string, listener: EventListener<HTMLElement>, useCapture?: boolean): void;
}

看起来它将大大改善它。

从我的iPhone发送

2014年8月3日,13:34,SaschaNaz [email protected]写道:

XMLHttpRequest对象也可以是currentTarget,但不是Element / HTMLElement。 也许这就是背后的原因。 泛型会改善这一点吗?

界面事件{
/ * ... _ /
currentTarget:T;
/ _ ... * /
}

接口EventListener{
(evt:事件):无效;
}

接口HTMLElement {
/ * ... * /
addEventListener(type:string,listener:EventListener,useCapture ?: boolean):void;
}
-
直接回复此电子邮件或在GitHub上查看。

请注意,并非每个事件目标都是Element (http://www.w3.org/TR/DOM-Level-3-Events/#event-types),因此此处的解决方案必须更多遵循@SaschaNaz的建议。

问题在于,当前我们基于脚本,基于当前无法公开的文件,使用脚本生成lib.d.ts,并且不赞成使用该文件,而推荐使用新文件。 因此,我们目前不会在脚本中进行改进,但是希望将来我们可以在lib.d.ts生成脚本/输入上进行PR。

现在标记“重新访问”-请在一个月内对我们进行ping操作,我可以看到我们的位置。

是否有引用当前类型的语法? 我认为,如果我们可以进行此类工作,则可以更轻松地解决此问题:

interface HTMLElement {
    addEventListener(type: string, listener: EventListener<this>, useCapture?: boolean): void;
}

var image: HTMLImageElement;
var video: HTMLVideoElement;
image.addEventListener // receives EventListener<HTMLImageElement> type
video.addEventListener // receives EventListener<HTMLVideoElement> type

该功能不存在,类似于#285和#229中的建议

大家好,ping这个线程。 我遇到了Event.target这个问题。 我可以想象大多数时候目标是HTMLElement 。 默认类型假定不是默认值有点奇怪。 我尝试了@SaschaNaz的建议,并遇到了“重复标识符”问题(对不起,我可能遗漏了一些东西,我对TypeScript很陌生)。

编辑:这可以使警告安静: (<HTMLElement>event.target).tagName

@rayshan的建议是应该将lib.d.ts文件放入什么文件,并且该文件是直接基于Internet Explorer的实现自动生成的。 因此,您遇到的错误是准确的。 现在,解决此问题的唯一方法是不使用内置lib( --noLib )进行构建,然后使用变通方法或执行您所做的操作,这将强制转换目标。 当前,在TypeScript中处理DOM的返回类型存在很多挑战(主要是因为DOM不是最一致/结构/类型安全/一致实现的API集)。

现在#4910已合并,可以重新讨论吗?

@zhengbli可能需要基于脚本的生成的lib.d.ts问题的状态有一些上下文

公关欢迎。 这是有关lib.d.ts更改的一些信息: https :

我在JS FileReader onload遇到了这个TS2339: Property 'result' does not exist on type 'EventTarget' ,并在传递给FileReader的onerror的事件中再次警告getSummary() onerror

我的解决方法是消除可怕的红色蠕变线条;-)如下:

interface FileReaderEventTarget extends EventTarget {
    result:string
}

interface FileReaderEvent extends Event {
    target: FileReaderEventTarget;
    getMessage():string;
}

然后在我的应用程序中:

reader.onload = function(fre:FileReaderEvent) {
        var data = JSON.parse(fre.target.result);
        ...
    }

生成的JS代码看起来不错,并且对我有用。 是否可以将针对非常规JS事件类型的这种解决方案添加到lib.d.ts中?

我猜我的解决方案过于简单。 但这有助于了解原因。

我很想解决这个问题。 但是,正如我看到的,对currentTarget的唯一引用是在TSJS生成器中生成的webworker.genic.d.ts文件中。 我不知道该如何解决😞
我真的希望有人能解决这个将近3年的问题。 这些错误可能是我经常听到人们说TypeScript难以使用的原因,这确实让我感到难过。

好。 我试图开始解决这个问题。 我创建了一个PR https://github.com/Microsoft/TSJS-lib-generator/pull/202
希望这是正确的方向。

我得到Property 'getBoundingClientRect' does not exist on type 'EventTarget'. 。 我认为这是个好主意。

好吧,公关将近两个月了。 如果可以采取任何措施来加快速度,我将进行调查。

如果我们可以让currentTarget是通用的,那就太好了,例如HTMLInputElement.onchange的类型可以是(event: Event<HTMLInputElement>) => void这样event.currentTarget.value可以不进行任何强制转换或键入注释。 React的类型可以做到这一点,但不幸的是dom.lib.d.ts不能。

这是由泛型导致的性能问题阻止的,因为引入泛型会使内存使用量翻倍😭

这些性能问题是否同样适用于React类型?

lib.d.ts不包括React类型,但是您可以通过在命令中添加--diagnostics来对其进行测试。

@felixfbecker我个人怀疑此问题将很快解决。 我想大多数人已经创建了解决方法或放弃了TypeScript。 这就是为什么很少有人遇到这个问题的原因。

版本1.18.0(1.18.0)中仍然存在此问题

你好,

与...相同的问题,我想它还没有解决。

当我将我的angular 4项目标记为生产时,问题就会出现,否则,而我只是使用ng serve ..这很好。 所以我想这与角度管理生产文件有关。

希望在这个问题上有所进展。 使用Typescript很难操纵dom。

这个问题已有四年之久,相应的PR也将近一年,我怀疑这个问题很快就会解决。

该问题已经存在了4年,但尚未解决。

https://github.com/Microsoft/TSJS-lib-generator/pull/207中提供了一个修复程序
但是@saschanaz根据性能阻止。

11点开始参加派对-卸载浏览器标签:
confirmationMessage(event: BeforeUnloadEvent): any {
const activeElement: HTMLElement = <HTMLElement>(<Document>event.target).activeElement;

:dancing_men:

怎么样添加

    readonly currentTarget: Element | null;
    readonly target: Element | null;

仅在UIEvent ? 这不是很具体,但是会使大多数代码满意。
甚至在没有UIEvent的| null的情况下,两者都总是被设置

同样的问题。 我试图将Vue与Typescript一起使用,并希望在用户键入时获取输入字段的值。 但是event.target.value不会通过类型检查器,即使-我认为-文本输入输出必须始终为此类事件产生此类字段

我们通过在代码中添加any来消除错误:

this.url = (<any>event).target.result;

键入Event和EventTarget怎么办?

interface Event<C = any, S = any, T = any> {
  ...
  currentTarget: EventTarget<C> | null;
  srcElement: EventTarget<S> | null;
  target: EventTarget<T> | null;
  ...
}

interface EventTarget<T = any> {
  ...
}

我在使用FileReader时遇到此问题,将其简单转换为正确的类型即可解决此问题

const fileReader = new FileReader();
fileReader.onload = $ev => {
  console.log($ev); // type ProgressEvent
  console.log($ev.target); // type FileReader
  // console.log($ev.target.result); // editor and autocomplete doesn't show any error
  console.log(($ev.target as FileReader).result); // casting compiles fine
};
fileReader.readAsText(file);

是否有关于此主题的任何更新? 无需每次或强制广播event.target (如@gautamkrishnar上面

的确,在6岁生日之前官方对这个问题做出某种回应会很好

是的,在使用DOM,JSX等时,这可能是第一天的麻烦。

实际上,这是我每天唯一的烦恼-我想有一百万人整天都这样。

真的很难理解为什么这没有得到任何优先考虑。

与event.target相同。 一种非常常见的方案是在尚不存在子代且子代数很多时,将单击处理程序添加到父元素。 对event.target.tagName甚至classList进行简单测试是我的常识。 它的工作原理...已经使用了很多年。 由于EventTarget未被归类为HTMLElement,所以我没有对tagName / classList的理解。

此页面是否有帮助?
0 / 5 - 0 等级