【问题标题】:TypeScript, Cannot find name declared inside if else [duplicate]TypeScript,找不到在内部声明的名称 if else [重复]
【发布时间】:2020-01-20 08:34:26
【问题描述】:
if (!challengeType) {
   const { brawl, fight }: any = await userModel
                                          .findOneAndUpdate(
                                               { _id: req.userData._id },
                                               { $inc: { 'fight.remaining': -1 } },
                                               { 'new': true }
                                           )
} else {
   const { brawl, fight }: any = await userModel
                                          .findOneAndUpdate(
                                               { _id: req.userData._id },
                                               { $inc: { 'brawl.remaining': -1 } },
                                               { 'new': true }
                                          )
}

// typescript error here
// "Cannot find name brawl", and "Cannot find name fight"

console.log(brawl, fight)

不知道为什么打字稿找不到名字 brawl and fight, 这可能是打字稿错误处理的问题 在 if else 语句的情况下,

但如果脚本正在运行,则没有发生任何问题。

【问题讨论】:

  • 我看到的一个问题是您将const { brawl, fight }: any 输入为any。这就是打字稿不会给出编译时错误的原因。如果将类型更改为 const { brawl, fight }: userModel 之类的类型,如果这些属性不存在,则会引发编译错误

标签: node.js typescript


【解决方案1】:

constlet 是块作用域,因此它们在高于它们声明所在的块的范围内不可用。您试图在声明它们的块之外访问它们。您可以声明它们let 在更高的范围内。

let result: any;
if (!challengeType) {
   result = await userModel.findOneAndUpdate(
           { _id: req.userData._id },
           { $inc: { 'fight.remaining': -1 } },
           { 'new': true });
} else {
   result = await userModel.findOneAndUpdate(
           { _id: req.userData._id },
           { $inc: { 'brawl.remaining': -1 } },
           { 'new': true });
}

// typescript error here
// "Cannot find name brawl", and "Cannot find name fight"
const { brawl, fight } = result;
console.log(brawl, fight);

您可能需要修复一些 TypeScript 语法,因为我并不真正了解 TypeScript,但您应该在这里了解大致的概念。


其实你可以DRY这个稍微顶一下,去掉一堆重复的代码。

const queryType: string = challengeType ? 'brawl' : 'fight';
const { brawl, fight }: any = await userModel.findOneAndUpdate(
                              { _id: req.userData._id },
                              { $inc: { [`${queryType}.remaining`]: -1 } },
                              { 'new': true });
console.log(brawl, fight);

不知道为什么 typescript 找不到 name brawl and fight

因为您试图在声明它们的范围之外访问这些变量。 ifelse 的主体是单独的块作用域,letconst 仅在该作用域内可用(注意 var 是函数作用域,而不是块作用域)。

在 if else 语句的情况下,这可能是 typescript 错误处理的问题,

不,这不是打字稿问题。这就是语言的设计方式。限制变量可以访问的范围是语言的一个特性。Javascript在这方面也是一样的。

【讨论】:

  • 是的,但是,为什么我仍然可以在 if else 的块范围之外访问它?是因为 typescript 是如何编译的吗?
  • @frostkazuma - 我不明白最后的评论。仅供参考,我在答案中添加了一个清理版本。
  • @frostkazuma 没有问题 - 这实际上是 TS 的一个功能。如果它没有在if/else 块之外为console.log(brawl, fight); 引发编译错误,那么您必须在外部范围内定义它们。
  • 它在我的 VS 代码上显示一个错误,但是当我运行它时它运行良好,我不知道为什么,我使用 ts-node-dev 运行我的开发环境。但如果我将它编译成 JS 可能会出错
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2016-05-23
  • 1970-01-01
  • 2019-04-24
相关资源
最近更新 更多