angular bug(核心):EventEmitter#subscribe() 应该正确地进行类型标注

sd2nnvve  于 5个月前  发布在  Angular
关注(0)|答案(5)|浏览(70)

🚀功能请求

相关包

此功能请求适用于@angular/core

描述

目前,订阅 EventEmitter (通过 EventEmitter#subscribe())会剥离EventEmitter的类型信息并将其转换为 any。这是不理想的,正如在 #6934 中指出的那样。
该问题以一个模糊不清的解释关闭,~ "你不应该使用EventEmitter的 subscribe() 方法"。然而, EventEmitter#subscribe() 没有被标记为内部API。
有人建议创建一个重复属性,使用rxjs主题,仅用于提高类型提示,这种建议是不令人满意的。
这是一个请求,为了允许直接订阅 EventEmitter 而保留类型信息,需要做任何必要的工作。

描述你希望实现的解决方案

已经存在于 EventEmitter 上的类型信息应该被保留。

描述你考虑过的替代方案

目前,建议的解决方法似乎是创建一个重复属性,并在关联数据更改时同时更新 @Output() 属性和重复的 Subject 属性。
例如:

class MyComponent {
  @Input() name: string;
  
  @Output()
  nameChange = new EventEmitter<string>();
  nameChange2 = new Subject<string>();

  @Input() weather: {prediction: string};
  
  @Output()
  weatherChange = new EventEmitter<{prediction: string}>();
  weatherChange2 = new Subject<{prediction: string}>();

  private updateName(name: string) {
    this.name = name;
    this.nameChange.emit(name);
    this.nameChange2.next(name);
  }

  private weatherName(value: {prediction: string}) {
    this.weather = value;
    this.weatherChange.emit(value)
    this.weatherChange2.next(value)
  }
}
``
z9zf31ra

z9zf31ra1#

这个解决方法

this.weatherChange.asObservable().subscribe(weather => {});

鼠标悬停在天气上时显示的是 { prediction: string; } 而不是 any
https://stackblitz.com/edit/angular-issues-29016?file=src%2Fapp%2Fmy%2Fmy.component.ts

u4vypkhs

u4vypkhs2#

感谢william-lohan!这对我来说已经足够好了。

zlhcx6iw

zlhcx6iw3#

我认为这个应该立即正确输入,所以我投票不关闭此问题。

blmhpbnm

blmhpbnm4#

好的,我暂时保持开放状态。

dsekswqp

dsekswqp5#

我基于重载实现了一个简单的实现,以遵循当前的实现。如果你愿意,我可以在这个playground链接上提交一个PR。
在Playground中,这三个都会显示出来,但是使用重载,只有前两个会,并且还能够区分调用。

相关问题