推断泛型类类型



假设我有以下类型:

type AnyFunction = (...args: any[]) => any;
abstract class Foo<F extends AnyFunction> {}
class Bar extends Foo<() => string> {}

我还有一个这样的函数:

function foo<F extends AnyFunction>(foo: Foo<F>): void {}

现在,当我调用foo()时,我希望有适当的类型推断,即当调用foo(new Bar())时,我希望类型() => string被推断为foo的泛型参数T。然而,出乎意料的是,TypeScript使用了AnyFunction(最不具体的类型)。

有办法解决这个问题吗?我需要能够以同样的方式调用foo(),但我也需要T被正确地推断为() => string

F在类中未使用。未使用的类型参数不是一个好主意,因为类型系统是结构化的,所以类的结构与声明无关,在这种情况下,也与声明的类型参数列表无关。

使用type参数,你将得到预期的类型:

type AnyFunction = (...args: any[]) => any;
abstract class Foo<F extends AnyFunction> {
f!: F
}
class Bar extends Foo<() => string> {}
function foo<F extends AnyFunction>(foo: Foo<F>): void {}
foo(new Bar) // foo<() => string>(foo: Foo<() => string>)

操场上联系

最新更新