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

Typescript 为什么泛型类型参数T";“未知”;在返回类型中?如何键入此函数以正确推断返回类型?,typescript,typescript-generics,Typescript,Typescript Generics,typescript手册()对一般约束作了如下说明: 可以声明受其他类型约束的类型参数 参数 在这个精心设计的示例中,如何正确推断wrap()返回类型中的“T” function wrap<T, F extends (() => T)>(cb: F): [T, F] { return [cb(), cb] } function load(): string { return '' } const [ value, // unknown, should be s

typescript手册()对一般约束作了如下说明:

可以声明受其他类型约束的类型参数 参数

在这个精心设计的示例中,如何正确推断wrap()返回类型中的“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)

函数包装T)>(cb:F):[T,F]{
返回[cb(),cb]
}
函数加载():字符串{
返回“”
}
常数[
值,//未知,应该是字符串。我可以用typescript来推断吗?
已包装,//()=>字符串
]=包裹(装载)

Typescript无法从类似于
func T)的构造中推断
T
。在这种情况下,通常最好依靠它。例如,我们可以使用实用程序类型,它在内部使用
推断
,并完全满足我们的需要:

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

function load(): string {
  return ''
}

const [
  value, // string
  wrapped, // () => string
] = wrap(load)
function wrap any)>(cb:F):[ReturnType,F]{
返回[cb(),cb]
}
函数加载():字符串{
返回“”
}
常数[
值,//字符串
已包装,//()=>字符串
]=包裹(装载)

Typescript无法从类似于
func T)的构造中推断
T
。在这种情况下,通常最好依靠它。例如,我们可以使用实用程序类型,它在内部使用
推断
,并完全满足我们的需要:

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

function load(): string {
  return ''
}

const [
  value, // string
  wrapped, // () => string
] = wrap(load)
function wrap any)>(cb:F):[ReturnType,F]{
返回[cb(),cb]
}
函数加载():字符串{
返回“”
}
常数[
值,//字符串
已包装,//()=>字符串
]=包裹(装载)

通用
T
是否确实需要?您可以使用
ReturnType
我认为表达这一点的最简单方式是
函数包装(cb:()=>T):[T,()=>T]{return[cb(),cb]}
。泛型
T
确实必要吗?您可以使用
ReturnType
我认为最简单的表达方式是
函数包装(cb:()=>T):[T,()=>T]{return[cb(),cb]}