- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有这段代码:
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
泛型类没有指定默认类型,后者被推断为 {}
。这通常不会有问题,因为 emit
是 the 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/
此处给出了基本的 Watir WebDriver 命令: http://watirwebdriver.com/web-elements/ 在大多数情况下,作者使用 :something => 'som
这里给出了基本的 Watir WebDriver 命令: http://watirwebdriver.com/web-elements/ 在大多数情况下,作者使用:something => 'some
我可以发誓我看到一个对象是以这种方式创建的。 somethingelse 有什么作用? 最佳答案 从字面上看,可能类 JSomething 有一个名为 somethingelse 的字段,类型为 JS
我正在阅读一些代码,我看到了一个如下所示的比较: a = b = c 看到在 Javascript 中搜索相等或比较如何产生补救结果,有人愿意解释发生了什么吗? 编辑:这些都是我们在这里讨论的所有对象
这个问题在这里已经有了答案: Is there a "null coalescing" operator in JavaScript? (19 个回答) 关闭 4 年前。 快速提问。我可以用更短的方
我正在尝试为我的网上商店做一个过滤器。我有以下查询 $column = mysqli_query($link, "SELECT brand FROM shields WHERE brand=".$br
我正在尝试将 json 文件映射到 mysql 数据库,请参阅 undefined index Name对于代码 我认为的问题是第三个条目中的任何一个元素都没有值,但有一个名为 aws:autosca
这个问题已经有答案了: Question mark and colon in JavaScript (8 个回答) 已关闭 5 年前。 我从 https://github.com/andrewgodw
我们知道编程语言中的后增量和前增量。据我所知,后增量意味着为下一条语句增加值。所以,something++ 等同于 something = something + 1,不是吗? 但是当 somethi
我有两个结构非常相似的表。 Universidades nombre | contenido | becas | fotos etc etc etc Internados nombre | todo
所以我有3张 table , Companies (company_id, company_name) Stock_Exchanges(stock_exchange_id, stock_exchang
我刚刚开始浏览 backbone fundamentals并且不太明白这里发生了什么: this.$input = this.$('#new-todo'); 有人可以给我概述/分割这实际上是做什么的吗
/*/ comment here do some thing. /*/ do some thing. //*/ 为什么人们会这样写代码?这是一个好的做法吗? 最佳答案 它通常只在暂时测试某些东西时使用
我正在查看一些微 Controller C 头文件,并且有这样的代码: #define OSCCONL OSCCONL extern volatile uint8_t OSCCONL __attrib
在 :contains jquery 调用中实现 OR 语句的最佳方法是什么? 谢谢 最佳答案 唯一的办法就是放两个 together : $('a:contains(b), a:contains(c
我有几个表需要连接。这些表是: 玩家 名字 姓氏 性别 location_id (其他不相关的列) 和 score_entries 得分 日期时间 玩家编号 (其他不相关的列) 我需要根据 playe
这个问题已经有答案了: Difference between single quotes and double quotes in Javascript [duplicate] (6 个回答) 已关闭
这是一段代码: if resp.email is None or resp.email == "": 我认为以下内容更清楚: if not resp.email: 第一个选项比第二个选项有什么优势吗?
我遇到了 this answer张贴者建议 的简写 if(typeof MyNamespace === 'undefined'){ var MyNamespace = {}; } 是 var
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
我是一名优秀的程序员,十分优秀!