非强制执行泛型的打字稿类型保护

时间:2016-11-22 19:54:44

标签: typescript typescript2.0

interface Foo {
    bar() : Promise<string>;
}

class MyFoo implements Foo {
    bar() : string {
        return "";
    }
}

class MyFoo2 implements Foo {
    bar() : Promise<number> {
        return new Promise<number>(null);
    }
}

上述两种实现中的每一种都不应该导致错误吗?

  • MyFoo确实收到错误,因为它返回字符串而不是Promise
  • MyFoo2会返回一个承诺,但类型错误,并且没有错误 - 为什么?

我能说的是TypeScript似乎检查返回类型的成员而不是声明的类型。但有没有办法以一种要求实现返回正确类型的方式声明这个接口?

编辑:似乎因为es6接口Promise是使用then() : Promise<T>之类的成员定义的,但没有类似于foo(): T,所以类型检查不会工作。如果我使用我的自定义通用接口模拟这个,如果接口包含T类型的成员,而不是T类型的泛型

,则会出错

1 个答案:

答案 0 :(得分:3)

这是当前稳定版TypeScript中的一个错误。

来源:

它已经修复,将包含在未来版本(2.1)中。

我也是自己尝试过的:

D:\Practice\TypeScript\ts-test>npm install -g typescript
C:\Users\dezsi\AppData\Roaming\npm\tsc -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsc
C:\Users\dezsi\AppData\Roaming\npm\tsserver -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsserver
C:\Users\dezsi\AppData\Roaming\npm
└── typescript@2.0.10


D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --version
Version 2.0.10

D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --target ES6 app.ts

D:\Practice\TypeScript\ts-test>npm install -g typescript@next
C:\Users\dezsi\AppData\Roaming\npm\tsc -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsc
C:\Users\dezsi\AppData\Roaming\npm\tsserver -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsserver
C:\Users\dezsi\AppData\Roaming\npm
└── typescript@2.2.0-dev.20161122



D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --version
Version 2.2.0-dev.20161122

D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --target ES6 app.ts
app.ts(5,7): error TS2420: Class 'MyFoo2' incorrectly implements interface 'Foo'.
  Types of property 'bar' are incompatible.
    Type '() => Promise<string>' is not assignable to type '() => Promise<number>'.
      Type 'Promise<string>' is not assignable to type 'Promise<number>'.
        Type 'string' is not assignable to type 'number'.

在这里,您可以看到尝试使用版本2.0.10并不会给我一个错误,而最新的2.2.0-dev.20161122正确报告Type 'string' is not assignable to type 'number'