考虑以下代码:
type A = string
interface Funcs<MyA extends A>
{
connect : (a : MyA) => any
}
function create <MyA extends A, MyFuncs extends Funcs<MyA>>(funcs : MyFuncs){}
function wrappedCreate<T extends A>()
{
const f : Funcs<T> = {
connect (a : T) { return null }
}
return create(f);
}
如您所见,create
泛型函数依赖于两种类型,第二种与第一种一起参数化。
查看 wrappedCreate
我认为调用 create
将根据提供的值正确推断两种类型。 Funcs<T>
应该满足 MyFuncs extends Funcs<MyA>
如果 T
根据其定义满足 MyA extends A
。但是打字稿在 create
调用行上给出了以下错误:
Argument of type 'Funcs<T>' is not assignable to parameter of type 'Funcs<string>'.
Type 'string' is not assignable to type 'T'.
'string' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string'.
打字稿是否能够推断出这种相互依赖的类型?我如何确保在此处输入严格?
如果我像这样手动指定类型没有错误:
return create<T, Funcs<T>>(f);
但我想知道在这种情况下 TypeScript 是否可以自行推断类型。