TypeScript:只有当T属于某种类型时,才能使通用接口A <t>的方法可用

时间:2016-01-17 22:49:54

标签: typescript typescript-generics

请看这段代码:

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();

我希望fooB<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

2 个答案:

答案 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