请看这段代码:
interface A<T> {
method1(): A<T>;
}
interface B<T extends Function> extends A<T> {
method2(): B<T>;
}
var foo: A<Function>;
foo.method1();
foo.method2();
我希望foo
与B<Function>
类型兼容,但我得到error TS2339: Property 'method2' does not exist on type 'A<Function>'
。我可以以某种方式重写接口B
以使其工作吗?
实际上,我正在尝试修复lodash _.memoize
的输入:
// This should be OK. The type of result1 should be compatible with aFunction.
var result1 = _(aFunction).memoize().value();
// And this should be an error.
var result2 = _(aNonFunctionValue).memoize().value();
更新。基本上,我的问题是:我是否可以为A<T>
编写这样的通用方法,只有当T
是其他某个子类型的子类型时它才可用输入U
?
答案 0 :(得分:3)
我可以以某种方式重写接口B以使其工作吗?
以下是代码:
var foo: A<Function>;
foo.method2(); // Should work
让我们退后一步,想想我们想要工作的东西:
A<Function>
这意味着method2
应该有interface A<T> {
method2<T extends Function>(): B<T>;
}
。所以:
T
此方法二在B
上添加了一个通用约束,并返回round(0.5)
类型的内容。
其余部分在最终解决方案中很明确
答案 1 :(得分:0)
原来TypeScript不支持此功能。见https://github.com/Microsoft/TypeScript/issues/1290