我认为在实例化泛型时我应该得到更多的类型错误 class,然后扩展它,然后覆盖一个实例字段 不一致的方式。代码:
class Abs<T> {
public f(v: T) : string {
return "";
}
}
class Imp extends Abs<{s: string}> {
public f(v) {
return v.noSuchField; // should be: 'return v.s'!
}
}
v
中参数new Imp().f
的推断类型似乎是
any
,而非{s: string}
。
我原本预计会发生以下两件事之一:
Imp.f
的参数没有子类型
{s: string}
。Imp.f
按预期键入{s: string}
,但是
此类型不包含字符串类型字段noSuchField
。......我有两个问题:
noSuchField
')?谢谢!
答案 0 :(得分:1)
这绝对不是一个错误。
关于第一点 - 由于Imp.f::v
的类型与其基本类型不完全匹配而导致的错误在任何标准OO语言中都不是错误。 Imp.f
就其参数而言是一个更通用的函数,而不是基类,因为any
是一个比{s: string}
更通用的参数。当您的参数比基本实现更通用时,您可以成为基类的子类。例如,在C#中,这不是错误:
class Foo {
public void x(FileStream s) { }
}
class Bar : Foo {
// Not an error, even though Bar.x:s is a more general type than Foo.x:s
public void x(Stream s) { }
}
第二,如果没有收到有关v.noSuchField
的错误,则表明预期的行为是因为v
的类型为any
。每当你有一个any
类型的表达式时,你基本上都不会因为那个表达式而得到类型错误。
请注意,类型永远不会被推断&#34;用于类成员函数声明的参数。 v
是any
(默认类型),因为它缺少类型注释。
您可以通过使用--noImplicitAny
标志进行编译来导致此代码出错,这会导致隐式任意类型的v
出错。添加某些类型注释后(当然不是any
),您将在v.noSuchField
上收到错误。