javascript - new EventEmitter() 与 new EventEmitter<Something>()

标签 javascript angular typescript generics

假设我有这段代码:

export class ProductsListComponent {
  @Output() onProductSelected: EventEmitter<Product>;

  constructor() { 
    this.onProductSelected = new EventEmitter();
  }
}

这是 EventEmitter 的一些例子用法。我不明白为什么我们首先声明 onProductSelect 明确声明它是 EventEmitter携带 Product 实例,然后我们只用 new EventEmitter() 实例化它.为什么不new EventEmitter<Product>()

我认为在 C# 中我必须采用第二种方式,否则如果 EventEmitter 将无法编译。是通用的。 为什么 TypeScript 不要求这样做?


//编辑:

进一步澄清我的问题。 有什么区别:

@Output() onProductSelected: EventEmitter<Product>;
this.onProductSelected = new EventEmitter();

@Output() onProductSelected: EventEmitter;
this.onProductSelected = new EventEmitter();

最佳答案

documentation chapter 中所述,类型参数推断发生在没有为泛型类或函数指定类型时。

一个函数可以从它的参数或返回类型推断出T类型,一个类可以从构造函数参数或返回类型推断出T类型:

function foo<T>(v: T) { return v }
foo(1); // T inferred to number

class Foo<T> {
  constructor(v: T) {}
}
new Foo(1); // T inferred to number

如果没有什么可推断的,T 被推断为空对象 {} for some reason :

class Foo<T> {
  foo(v: T) {}
}

new Foo().foo(1); // T inferred to {}

为了避免对 {} 的推断,可以提供默认类型:

class Foo<T = string> {
  foo(v: T) {}
}

new Foo().foo(1); // type error

如果泛型类或函数不应该与默认类型一起使用,可以指定一些不可能的类型:

class Foo<T = never> {
  foo(v: T) {}
}

new Foo(); // no type error, T isn't involved
new Foo().foo(<any>1); // type error

由于 EventEmitter 泛型类没有指定默认类型,后者被推断为 {}。这通常不会有问题,因为 emitthe only method that is affected by generic type .由于所有非 null 类型都可以强制转换为对象类型,因此这通常不会导致类型错误 - 只要 nully 类型被忽略。

strictNullChecks compiler option对于具有默认类型和空值的 EventEmitter 将是一个问题:

const ee = new EventEmitter();
ee.emit(null); // type error

所以对于全方位的 EventEmitter 它不应该依赖于默认类型并且被实例化为:

const ee = new EventEmitter<any>();

关于javascript - new EventEmitter() 与 new EventEmitter<Something>(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48596562/

相关文章:

unit-testing - 没有 Token AppId 的提供者

javascript - 如何从某些对象中过滤 json 对象。 (仅选择部分值)

css - 在 Angular 2 中动态设置以 "mark-as-"开头的所有类的样式

javascript - 测试可观察回调以更改对象状态

angular - Material 日期-fns 适配器

javascript - 组件无法从延迟加载模块中找到提供程序

javascript - SessionStorage 和 json 对象

javascript - 在接受服务器请求之前等待种子数据

javascript - JVector map 脉动标记

javascript - 在轮播中添加新元素会在 Angular4 中添加新行