如何在Typescript中初始化一个变量,该变量最终将被设置为异步请求的响应?

0md85ypi  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(97)

作为一个相对较新的打字脚本,我遇到了一个在我的第一个项目中没有遇到的问题-当在try-catch内部的API请求 * 之前 * 声明一个变量时,似乎会在try-catch * 之后I对这个变量进行操作时抛出打字脚本错误。
我已经编写了示例代码来显示下面的问题。
res是有问题的变量,位于if语句的顶部。

interface AuthApiData {
      message: string;
      success: boolean;
    }

    interface AuthApiRes {
      status: number;
      data: AuthApiData;
    }

    if (router.pathname !== '/login') {
      let res: AuthApiRes;
      
      let status;
      const authenticate = async () => {
        try {
          res = await axiosPrivate.get('/api/gilat');
          status = res?.status;
        } catch (err) {
          console.log('authflow err:', err);
        }
      };

      authenticate();

      if (status === 200 && res?.data?.success === true) {
        // I wanted to continue writing code here
      }
    }

如果有人想知道typescript在哪里抛出了错误,以及错误出现在工具提示上,我在问题的底部放了一张图片。
这里的所有代码都是在try-catch语句之前声明一个变量res,然后尝试在其后的if语句中使用这个变量,在try-catch内部有一个API请求,当异步请求被解析时,它会将结果设置为这个res变量。
如果我声明res是某个适合它的接口的初始对象,错误就会消失,例如res = { status: 403, data: ... }
我还尝试用以下代码初始化它的类型:
let res = AuthApiRes | undefined
这解决了问题,但我发现它很混乱,或者更确切地说,我不确定这是否只是“欺骗” typescript 。
我不希望将这个变量初始化为一个空的占位符对象,而是希望它在API解析之前保持未赋值状态。
这是可能的吗?如果不是,我怎么能在不初始化变量或在声明过程中为它的类型设置union“or”undefined的情况下删除这个错误呢?

rhfm7lfc

rhfm7lfc1#

我还尝试用以下代码初始化它的类型:
第一个月
这解决了问题,但我发现它很混乱,或者更确切地说,我不确定〉这是否只是"欺骗" typescript 。
当一个变量被声明但没有初始化时,它的值是undefined,因为当你把undefined和并集相加时,这个类型脚本不会抱怨。
对我来说,最好的方法是将res初始化为null,然后检查它:

let res: AuthApiRes | null = null;

if(res) {
  if(status === 200 && res.data?.success === true) {
    ...
  }
}

status变量也是如此。
如果您不喜欢这种方法,可以在res前面加上!
let res!: AuthApiRes
这暗示了您实际上将为res赋值的 typescript ,但是您将丢失 typescript 检查,对我来说,这不值得。

相关问题