打字稿:推断使用另一种类型参数化的泛型参数类型

时间:2021-01-19 11:52:50

标签: typescript generics

考虑以下代码:

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 是否可以自行推断类型。

0 个答案:

没有答案