【发布时间】:2017-12-13 15:58:12
【问题描述】:
如果我创建一个泛型类
class Generic<T> {
prop: T;
}
如果没有在类型中指定T,它将不允许我输入内容
// Generic type 'Generic<T>' requires 1 type argument(s).
const val: Generic = new Generic();
但是如果我使用类型推断,它不会抱怨,它让我实例化它
const val = new Generic();
// field prop is not of type any, we can't access any properties on it
// val.prop.anything -> Compiler error
// val.prop.toString() -> No error, is it a string?
// val.prop.length -> Compiler error, not a string, just assumes that everything has a toString (based on boxing)
是否指定了此行为?这背后的原因是什么?
背景
Angular2 有一个EventEmitter,它需要事件的参数类型。但是,对于某些事件,您不传递任何参数,在这种情况下,我们一直使用EventEmitter<void>。但是,我只是注意到您可以在不指定类型的情况下定义发射器,new EventEmitter() 可以工作。这种方法的缺点是如果您将参数传递给emitter.emit('something'),编译器不会抱怨。这不是我感兴趣的,只是背景,以便读者了解问题的来源。
【问题讨论】:
-
由于泛型在运行时不可用(它将全部变为纯 Javascript),我可以想象
new Generic()行是允许的,因为您可以在导入转译库的 Javascript 中使用这一行.简而言之:为了与 Javascript 兼容。 -
您使用的是哪个版本的打字稿?尝试编译您的代码时出现错误。
Generic type 'Generic<T>' requires 1 type argument(s). -
@Sebastian 我无法理解你在说什么......有任何链接可以验证你的想法吗?如果允许,那么现在您有一个没有类型的属性,这似乎与 JavaScript 不兼容,因为如果您想使用它,您必须将
prop转换为某种东西? -
@Duncan 我正在使用在线游乐场,我认为它是最新的?
标签: angular typescript generics