如何使声明的函数根据用法自动推断类型?

Jay*_*Jay 4 typescript

我觉得这在打字稿中应该是完全可能的,但打字稿似乎不能正确地输入它。有什么办法可以做到这一点吗?这是一个超级简单的示例,但我特别希望在将函数传递给反应组件的 prop 时自动推断参数类型,该 prop 接受具有定义类型的回调

实际的

function constrainingFunction(b: number) {
    return b + 1
}

function test(a) { // ERROR: `a` implicitly has an `any` type
    constrainingFunction(a)
}

test(1)
Run Code Online (Sandbox Code Playgroud)

预期的

function constrainingFunction(b: number) {
    return b + 1
}

function test(a) { // `a` should properly be inferred as `number`
    constrainingFunction(a)
}

test(1)
Run Code Online (Sandbox Code Playgroud)

jca*_*alz 5

请参阅microsoft/TypeScript#34738以获取规范答案。

TypeScript 不会通过这种方式执行函数参数的上下文类型,这显然是出于性能原因。根据TS 团队开发负责人的评论

自成立以来,这一直是一个有意的设计限制;这样做是 TS 性能遥不可及的一个关键原因。

相关问题中也有这样的评论:

人们已经数百次问我们为什么不这样做;答案是,除了玩具程序之外,以一种稳定、高性能的检查结果的方式来执行此操作在架构上是不切实际的。

因此,a需要对参数进行显式注释,以便number此代码能够按预期工作而不会出现错误。


但您不一定需要亲自注释它。正如上面的两条评论继续说的:

“从使用推断”重构将根据请求为您生成一个类型。

“从使用推断”重构可用于此目的。

因此 TypeScript可以根据使用情况推断类型,但不会在编译期间自动推断类型。您可以在支持代码操作(例如Visual StudioTypeScript Playground )的 IDE 中专门请求它。

如果您选择有问题的a参数,您应该会看到一个灯泡,单击该灯泡时,会建议“根据使用情况推断参数类型”:

function constrainingFunction(b: number) {
  return b + 1
}
//  [ infer parameter types from usage ]
function test(a) { // ERROR: `a` implicitly has an `any` type
  // -------> ~
  constrainingFunction(a)
}

test(1)
Run Code Online (Sandbox Code Playgroud)

如果您接受该建议,则会出现所需的显式注释:

function constrainingFunction(b: number) { // <-- magic!
  return b + 1
}
function test(a: number) {
  constrainingFunction(a)
}

test(1)
Run Code Online (Sandbox Code Playgroud)

补充动画截图:

动画截图

所以这对你来说可能是一些安慰。

Playground 代码链接