作为一个相对较新的打字脚本,我遇到了一个在我的第一个项目中没有遇到的问题-当在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的情况下删除这个错误呢?
1条答案
按热度按时间rhfm7lfc1#
我还尝试用以下代码初始化它的类型:
第一个月
这解决了问题,但我发现它很混乱,或者更确切地说,我不确定〉这是否只是"欺骗" typescript 。
当一个变量被声明但没有初始化时,它的值是
undefined
,因为当你把undefined
和并集相加时,这个类型脚本不会抱怨。对我来说,最好的方法是将
res
初始化为null
,然后检查它:status
变量也是如此。如果您不喜欢这种方法,可以在
res
前面加上!
let res!: AuthApiRes
这暗示了您实际上将为
res
赋值的 typescript ,但是您将丢失 typescript 检查,对我来说,这不值得。