【问题标题】:varA = varA + varB doesn't work in typescriptvarA = varA + varB 在打字稿中不起作用
【发布时间】:2020-09-19 16:09:44
【问题描述】:

我正在 ts 中为我的 Angular 项目制作一个运行总计算器方法,

Total(){
let t: any;
for (let n = 0; n < this.checkoutItems.length; n++) {
  let key = this.checkoutItems[n].item_id ;
  this.itemsService.getCheckoutItem(key, 2).subscribe((response: any) => {
  this.checkoutItem = response;
  let y = localStorage.getItem(key);
  console.log("y:");
  console.log(y);
  let x=+y;
  console.log("x:");
  console.log(x);
  let a= +this.checkoutItems[n].price;
  console.log("a:");
  console.log(a);
  let b = a*x;
  console.log("b:");
  console.log(b);
   t +=b;
  console.log("t:");
  console.log(t);
  })
}
}

b 的控制台日志一切正常,他们在我的控制台上打印所需的输出,但由于某种原因,t 的控制台日志返回 NaN ?为什么会这样?对不起,我是打字稿的新手。

【问题讨论】:

  • 我很困惑。这和local-storage 有什么关系?这和angular 有什么关系?此外,如果您将所有内容都输入为any,那么使用 TypeScript 的意义何在,这本质上意味着“没有类型检查,就像在 ECMAScript 中一样”?那么,为什么不直接使用 ECMAScript 呢?请确保构造一个minimal reproducible example。你的问题可以用两行代码来演示,而现在的编写方式需要我安装 Angular、创建项目、创建服务和其他一些东西来测试它。

标签: angular typescript local-storage


【解决方案1】:

这样写。如果你没有初始化它,你不能添加任何东西。所以首先检查是否未定义然后使用它

t ? t+=b : t=b;

【讨论】:

  • 我的错,我认为 any 采用对象解析的类型。当您最初将其定义为 0 时,它会起作用。非常感谢!
【解决方案2】:

t +=b 表示t = t+b 那么t 在此行之前设置在哪里?

正因为如此...你有 t = undefined + b 所以 NaN,这就是我在没有尝试你的代码的情况下猜到的(我感到羞耻)。

如果您正在处理一个计数器,您可以在最开始定义它时将t 安全地设置为 0。像 => let t = 0 这样的东西。 如果t 是您的结果,您甚至可以使用reduce 来避免外部变量声明和for 循环。

【讨论】:

  • 我的错,我认为变量类型 any 采用对象解析成的类型,这对我来说是全新的,有很多东西要学 XD
  • 别担心,这很正常。我建议您使用不同的方法。一个好的方法是在任何地方使用const,当你不能使用它时,问问自己你是否以正确的方式实现它。 99% 的时间你不需要let。你只需要考虑如何实现一些东西来保持它的不变性。
【解决方案3】:

你的问题可能真的是demonstrated in just two lines:

let t: any;
t + 42
//=> NaN

你得到NaN的原因是uninitialized variables evaluate to undefinedundefined is converted to NaN in a numeric contextNaN + anything is NaN

TypeScript 无法帮助您并指出您的错误的原因是,通过将 t 显式输入为 any,您实际上已经告诉 TypeScript:“我不知道这是什么,您不知道这是什么,所以让我们假装一切都很好,好吗?”换句话说,你告诉 TypeScript 不能帮助你。

如果您输入的是number,例如this would have happened

let t: number;
t + 42
// ERROR: Variable 't' is used before being assigned.

The correct way 会将t 初始化为您正在执行的操作的标识值。 (另外,身份是0。)

let t: number = 0; // Or just `let t = 0` and the type will be inferred correctly
t + 42
//=> 42

真正正确的解决方案可能是某种形式的 reduce 而非 this.checkoutItems

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 2018-12-25
    • 1970-01-01
    • 2018-11-23
    • 2023-04-07
    • 2020-03-18
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多