代码之家  ›  专栏  ›  技术社区  ›  Leon Gaban

typescript,json.parse错误:“类型'null'不能分配给类型'string'。”

  •  0
  • Leon Gaban  · 技术社区  · 6 年前

    错误发生在这里:

    let moonPortfolio;
    ...
    moonPortfolio = JSON.parse(localStorage.getItem('moonPortfolio'));
    

    我发现 this answer 这是有道理的,但是在这次重构之后,我仍然会遇到这个错误:

    如错误所述,localstorage.getitem()可以返回字符串或空值。parse()需要一个字符串,因此在尝试使用它之前,应该测试localstorage.getitem()的结果。

    if (portfolio.length === 0) {
      const storedPortfolio = localStorage.getItem('moonPortfolio');
    
      if (typeof storedPortfolio === 'string') {
        moonPortfolio = JSON.parse(localStorage.getItem('moonPortfolio'));
      }
      else {
        moonPortfolio = [];
      }
    
      if (moonPortfolio) {
        const savedPortfolio = Object.values(moonPortfolio);
        this.props.fetchAllAssets();
        // this.props.addCoins(savedPortfolio);
      }
    }
    

    enter image description here

    我首先设置本地存储的结果 moonPortfolio 到一个变量,然后检查该变量是否 typeof 字符串。仍然收到typescript错误吗?

    有什么想法或方向吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   p.s.w.g    6 年前

    编译器对 localStorage.getItem 并没有假设一次调用的返回值是相同的 getItem 下一个。所以它只是告诉你在第二次打电话给 格雷特姆 结果 不是 null .

    尝试简单地传入您已经创建的变量,而不是从 localStorage 再一次:

    if (typeof storedPortfolio === 'string') {
      moonPortfolio = JSON.parse(storedPortfolio);
    }
    
        2
  •  1
  •   Ryan Cavanaugh    6 年前

    typescript不知道 localStorage.getItem 使用相同的字符串文本将始终返回相同的值(事实上,这甚至不是真的)。

    第二次呼叫 localStorage.getItem('moonPortfolio') 很可能会回来 null -你应该打电话 JSON.parse(storedPortfolio) 而不是打电话 getItem 再一次。