interface Foo {
bar() : Promise<string>;
}
class MyFoo implements Foo {
bar() : string {
return "";
}
}
class MyFoo2 implements Foo {
bar() : Promise<number> {
return new Promise<number>(null);
}
}
上述两种实现中的每一种都不应该导致错误吗?
我能说的是TypeScript似乎检查返回类型的成员而不是声明的类型。但有没有办法以一种要求实现返回正确类型的方式声明这个接口?
编辑:似乎因为es6接口Promise
是使用then() : Promise<T>
之类的成员定义的,但没有类似于foo(): T
,所以类型检查不会工作。如果我使用我的自定义通用接口模拟这个,如果接口包含T
类型的成员,而不是T
类型的泛型
答案 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'
。