You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LocalStorage中的对象映射到JwtToken接口?

解决LocalStorage数据映射到TypeScript接口的问题

你的核心问题出在两个地方:一是没处理localStorage.getItem(_key)可能返回null的场景,二是类型断言的时机和方式不对。TypeScript的类型断言仅作用于编译阶段,不会在运行时校验数据结构,同时直接对null执行JSON.parse会抛出错误。

修正后的基础写法

先处理null和解析异常,再将解析后的对象断言为JwtToken:

retrieveToken(): JwtToken | null {
  const tokenStr = localStorage.getItem(_key);
  // 处理key不存在的情况
  if (!tokenStr) {
    return null; // 也可根据业务需求抛出错误
  }
  try {
    // 先解析字符串为对象,再断言为JwtToken类型
    return JSON.parse(tokenStr) as JwtToken;
  } catch (error) {
    console.error('Token解析失败:', error);
    return null; // 或做其他错误处理
  }
}

为什么之前的写法无效

  • return JSON.parse(localStorage.getItem(_key) as JwtToken);:错误地将string|null直接断言为JwtToken,但localStorage存储的是字符串,必须先解析成对象才能匹配接口类型。
  • return JSON.parse<JwtToken>(localStorage.getItem(_key));:localStorage.getItem(_key)可能返回null,JSON.parse(null)会得到null,与函数声明的返回类型JwtToken不匹配,导致编译报错。

进阶:添加运行时类型校验

如果需要确保返回的数据完全符合JwtToken接口(避免存储的数据结构异常),可以添加类型守卫函数做运行时校验:

export interface JwtToken {
  access_token: string;
  expires_in: number;
  token_type: string;
  refresh_token: string;
}

// 类型守卫函数,判断对象是否符合JwtToken结构
function isJwtToken(obj: unknown): obj is JwtToken {
  return (
    typeof obj === 'object' &&
    obj !== null &&
    typeof (obj as JwtToken).access_token === 'string' &&
    typeof (obj as JwtToken).expires_in === 'number' &&
    typeof (obj as JwtToken).token_type === 'string' &&
    typeof (obj as JwtToken).refresh_token === 'string'
  );
}

retrieveToken(): JwtToken | null {
  const tokenStr = localStorage.getItem(_key);
  if (!tokenStr) return null;
  
  try {
    const parsedToken = JSON.parse(tokenStr);
    if (isJwtToken(parsedToken)) {
      return parsedToken;
    } else {
      console.error('Token结构不符合JwtToken接口定义');
      return null;
    }
  } catch (error) {
    console.error('Token解析失败:', error);
    return null;
  }
}

内容的提问来源于stack exchange,提问作者Code Ratchet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:43:20