我觉得这在打字稿中应该是完全可能的,但打字稿似乎不能正确地输入它。有什么办法可以做到这一点吗?这是一个超级简单的示例,但我特别希望在将函数传递给反应组件的 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)
请参阅microsoft/TypeScript#34738以获取规范答案。
TypeScript 不会通过这种方式执行函数参数的上下文类型,这显然是出于性能原因。根据TS 团队开发负责人的评论,
自成立以来,这一直是一个有意的设计限制;不这样做是 TS 性能遥不可及的一个关键原因。
相关问题中也有这样的评论:
人们已经数百次问我们为什么不这样做;答案是,除了玩具程序之外,以一种稳定、高性能的检查结果的方式来执行此操作在架构上是不切实际的。
因此,a需要对参数进行显式注释,以便number此代码能够按预期工作而不会出现错误。
但您不一定需要亲自注释它。正如上面的两条评论继续说的:
“从使用推断”重构将根据请求为您生成一个类型。
“从使用推断”重构可用于此目的。
因此 TypeScript可以根据使用情况推断类型,但不会在编译期间自动推断类型。您可以在支持代码操作(例如Visual Studio或TypeScript 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)
补充动画截图:
所以这对你来说可能是一些安慰。
| 归档时间: |
|
| 查看次数: |
2352 次 |
| 最近记录: |