为什么泛型类型参数 T 在返回类型中是“未知”?如何输入此函数以便正确推断返回类型?

1 typescript typescript-generics

打字稿手册(https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-constraints)这样描述了通用约束:

您可以声明一个受另一个类型参数约束的类型参数。

在这个人为的示例中,如何正确推断wrapp()的返回类型中的“T”?


function wrap<T, F extends (() => T)>(cb: F): [T, F] {
  return [cb(), cb]
}

function load(): string {
  return ''
}

const [
  value, // unknown, should be string. Can I get typescript to infer this?
  wrapped, // () => string
] = wrap(load)
Run Code Online (Sandbox Code Playgroud)

Mir*_* S. 5

TypescriptT在从这样的构造中进行推断时存在问题func<T, F extends (() => T)>。在这种情况下,通常最好依靠infer。对于您的示例,我们可以使用实用程序类型ReturnType,它在内部使用infer并完全满足我们的需要:

function wrap<F extends (() => any)>(cb: F): [ReturnType<F>, F] {
  return [cb(), cb]
}

function load(): string {
  return ''
}

const [
  value, // string
  wrapped, // () => string
] = wrap(load)
Run Code Online (Sandbox Code Playgroud)