Typescript,无法读取会话存储中存储的数组

Typescript,无法读取会话存储中存储的数组,typescript,Typescript,假设我有一个arroy作为字符串存储在会话存储中,我想读取它,添加一个元素,然后将其设置回原处 trackNavHistory = (path: String) => { let historyArr : Array<String> = sessionStorage.getItem("navHistory")?.split(","); historyArr.push(path) sessionStorage.set

假设我有一个arroy作为字符串存储在会话存储中,我想读取它,添加一个元素,然后将其设置回原处

trackNavHistory = (path: String) => {
    let historyArr : Array<String> = sessionStorage.getItem("navHistory")?.split(",");
    historyArr.push(path)
    sessionStorage.setItem(JSON.stringify(historyArr));
  }
trackNavHistory=(路径:字符串)=>{
let historyArr:Array=sessionStorage.getItem(“navHistory”)?.split(“,”);
历史到达推送(路径)
setItem(JSON.stringify(historyArr));
}
所以historyArr基本上应该是从sessionStorage读取的字符串数组

但它又回来了

类型“string[]| undefined”不能分配给类型“string[]”。
类型“未定义”不可分配给类型“字符串[]”

然后我就不能把它放回去了。 什么问题

我也试过了

trackNavHistory = (path: String) => {
    let historyArr : Array<String> = JSON.parse(sessionStorage.getItem("navHistory"));
    historyArr.push(path)
    sessionStorage.setItem(JSON.stringify(historyArr));
  }
trackNavHistory=(路径:字符串)=>{
让historyArr:Array=JSON.parse(sessionStorage.getItem(“navHistory”);
历史到达推送(路径)
setItem(JSON.stringify(historyArr));
}
类型为“string | null”的参数不能分配给的参数 键入“string”。类型“null”不可分配给类型 '字符串'.ts(2345)


首先,get和set应该是相反的-不要试图欺骗JSON

其次,这不是“崩溃”,而是TypeScript编译器错误。TypeScript告诉您需要检查是否没有值(
getItem
返回类型为
string | null
,您需要
string
类型)

为了解决这个问题

  • 我们首先获取会话数据
  • 我们检查数据是否不为null、未定义等
  • 如果我们有数据,我们解析它并将其放入数组中
  • 然后我们推到数组上,它要么是空的(没有会话数据),要么是满的(会话数据)
  • 我们最终将会话数据设置回原来的位置

  • 首先,get和set应该是相反的-不要试图欺骗JSON

    其次,这不是“崩溃”,而是TypeScript编译器错误。TypeScript告诉您需要检查是否没有值(
    getItem
    返回类型为
    string | null
    ,您需要
    string
    类型)

    为了解决这个问题

  • 我们首先获取会话数据
  • 我们检查数据是否不为null、未定义等
  • 如果我们有数据,我们解析它并将其放入数组中
  • 然后我们推到数组上,它要么是空的(没有会话数据),要么是满的(会话数据)
  • 我们最终将会话数据设置回原来的位置

  • 在typescript中定义
    字符串
    类型的常见做法是使用以小写字母开头的
    字符串
    关键字

    你的第二种方法是正确的。在将数据持久化到
    sessionStorage
    JSON.parse
    中之前,应该使用
    JSON.stringify
    ,以从JSON获取数组

    let historyArr
    声明为一个变量,该变量只能保存字符串数组
    let historyArr:array
    ,但由于
    sessionStorage.getItem
    可以返回
    string
    null
    JSON.parse(null)===null
    typescript抱怨无法将此操作的结果(
    JSON.parse(sessionStorage.getItem(“navHistory”);historyArr.push(path)
    )分配给
    historyArr
    变量

    我建议这样做:

    const trackNavHistory = (path: string) => {
        let navHistory = sessionStorage.getItem('navHistory');
    
        if (!navHistory) {
            sessionStorage.setItem('navHistory', JSON.stringify([path]));
            return;
        }
    
        const historyArr: Array<string> = JSON.parse(navHistory);
    
        historyArr.push(path);
    
        sessionStorage.setItem('navHistory', JSON.stringify(historyArr));
    };
    
    const trackNavHistory=(路径:字符串)=>{
    让navHistory=sessionStorage.getItem('navHistory');
    如果(!navHistory){
    setItem('navHistory',JSON.stringify([path]);
    返回;
    }
    const historyArr:Array=JSON.parse(navHistory);
    历史到达推送(路径);
    setItem('navHistory',JSON.stringify(historyArr));
    };
    
    在typescript中定义
    字符串
    类型的常见做法是使用以小写字母开头的
    字符串
    关键字

    你的第二种方法是正确的。在将数据持久化到
    sessionStorage
    JSON.parse
    中之前,应该使用
    JSON.stringify
    ,以从JSON获取数组

    let historyArr
    声明为一个变量,该变量只能保存字符串数组
    let historyArr:array
    ,但由于
    sessionStorage.getItem
    可以返回
    string
    null
    JSON.parse(null)===null
    typescript抱怨无法将此操作的结果(
    JSON.parse(sessionStorage.getItem(“navHistory”);historyArr.push(path)
    )分配给
    historyArr
    变量

    我建议这样做:

    const trackNavHistory = (path: string) => {
        let navHistory = sessionStorage.getItem('navHistory');
    
        if (!navHistory) {
            sessionStorage.setItem('navHistory', JSON.stringify([path]));
            return;
        }
    
        const historyArr: Array<string> = JSON.parse(navHistory);
    
        historyArr.push(path);
    
        sessionStorage.setItem('navHistory', JSON.stringify(historyArr));
    };
    
    const trackNavHistory=(路径:字符串)=>{
    让navHistory=sessionStorage.getItem('navHistory');
    如果(!navHistory){
    setItem('navHistory',JSON.stringify([path]);
    返回;
    }
    const historyArr:Array=JSON.parse(navHistory);
    历史到达推送(路径);
    setItem('navHistory',JSON.stringify(historyArr));
    };
    
    您的变换输入和输出应该匹配。阅读时不需要
    JSON.parse
    ,但写作时需要
    JSON.stringify
    。你写的和读的数据应该是相反的,所以不要试着去做一些事情。@crashmstr这就是我在第二个例子中所做的,但是它会使Touthink崩溃,告诉你错误是什么
    sessionStorage.getItem
    被键入以返回
    string | null
    JSON.stringify
    采用
    string
    。您需要向编译器“证明”
    getItem
    不返回null。另外,您的
    setItem
    调用缺少
    参数。而且,这不是“崩溃”。这是一个编译器错误,TypeScript告诉您,从类型安全的角度来看,您做了一些可能不正确的事情。您需要理解运行时和编译时之间的区别。该错误是编译器错误。你在会话中没有遇到问题