在扩展和泛型类时期望类型错误

时间:2014-05-27 15:28:17

标签: typescript

我认为在实例化泛型时我应该得到更多的类型错误 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}

我原本预计会发生以下两件事之一:

  1. 类型错误,因为Imp.f的参数没有子类型 {s: string}
  2. 类型错误,因为Imp.f按预期键入{s: string},但是 此类型不包含字符串类型字段noSuchField
  3. ......我有两个问题:

    1. 你们是否同意这是打字稿中的错误?
    2. 有没有办法做到这一点,给我预期的类型错误 ('没有这样的字段:noSuchField')?
    3. 谢谢!

1 个答案:

答案 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;用于类成员函数声明的参数。 vany(默认类型),因为它缺少类型注释。

您可以通过使用--noImplicitAny标志进行编译来导致此代码出错,这会导致隐式任意类型的v出错。添加某些类型注释后(当然不是any),您将在v.noSuchField上收到错误。