如何在没有 `strictTemplates` 的情况下使用自定义事件(不是事件发射器)来抱怨 `$event` 不是自定义事件类型?

ghi*_*ing 5 javascript typescript angular angular-slickgrid

我创建了一个名为Angular-Slickgrid的 Angular 库,它是SlickGrid的包装器,它是一个旧的 JavaScript/jQuery 库,我可以使用 SlickGrid 发送的任何自定义事件而没有任何问题,如下所示(此时一切都很好)

<angular-slickgrid gridId="grid28"
    [columnDefinitions]="columnDefinitions"
    [gridOptions]="gridOptions"
    [dataset]="dataset"                    
    (onSelectedRowsChanged)="handleOnSelectedRowsChanged($event.detail.eventData, $event.detail.args)">
</angular-slickgrid>
Run Code Online (Sandbox Code Playgroud)

一切都很好,一切正常

handleOnSelectedRowsChanged(event: any, args: OnSelectedRowsChangedEventArgs) {
    console.log(args);
}
Run Code Online (Sandbox Code Playgroud)

在我的库中,我只是用一个具有以下代码的小函数来调度这些事件

/** Dispatch of Custom Event, which by default will bubble & is cancelable */
dispatchCustomEvent(eventName: string, data?: any, isBubbling: boolean = true, isCancelable: boolean = true) {
  const eventInit: CustomEventInit = { bubbles: isBubbling, cancelable: isCancelable };
  if (data) {
    eventInit.detail = data;
  }
  return this.elm.nativeElement.dispatchEvent(new CustomEvent(eventName, eventInit));
}
Run Code Online (Sandbox Code Playgroud)

一切都是美好的,生活是美好的……

启用时它会中断 strictTemplates

当我决定,以使strictTemplates进入angularCompilerOptions即当角开始抱怨$event是一种类型Event,它抱怨说,detail是不是有效的属性,但在我实现它不是类型的Event,它应该被检测为类型CustomEvent

为什么 Angular 没有将其检测为CustomEvent?是否有任何方法可以强制将类型检测为CustomEvent或覆盖类型而CustomEvent不用 Angular 抱怨?

到目前为止,我发现绕过这些错误的唯一(丑陋)方法是让它认为它是一种类型Event,然后将其转换回CustomEvent,这有效但它添加了太多不方便的代码

<angular-slickgrid gridId="grid28"
    [columnDefinitions]="columnDefinitions"
    [gridOptions]="gridOptions"
    [dataset]="dataset"                    
    (onSelectedRowsChanged)="handleOnSelectedRowsChanged($event)">
</angular-slickgrid>
Run Code Online (Sandbox Code Playgroud)

然后将其强制转换EventCustomEvent,即使这样有效,它也会添加很多不方便的代码

handleOnSelectedRowsChanged(event: Event) {
    const args = (event as CustomEvent).detail.args as OnSelectedRowsChangedEventArgs;
    console.log(args);
}
Run Code Online (Sandbox Code Playgroud)

我不想也不能使用事件发射器,因为这些事件是动态的,而且因为这些事件来自 JavaScript 库,还有其他技术原因,但我又不能使用事件发射器。

在此处输入图片说明

这可以通过 Angular Directive 解决吗?我已经看到了另一个 SO Angular 4 触发自定义事件 - EventEmitter vs dispatchEvent()有点走这条路线,但我仍然不确定如何处理这个。

Jay*_*ase 1

使用$any()函数禁用$event的类型检查可能会解决此错误。

<angular-slickgrid gridId="grid28"
    [columnDefinitions]="columnDefinitions"
    [gridOptions]="gridOptions"
    [dataset]="dataset"                    
    (onSelectedRowsChanged)="handleOnSelectedRowsChanged($any($event))">
</angular-slickgrid>
Run Code Online (Sandbox Code Playgroud)