假设我有以下类型:
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>)
操场上联系