当前,我正在编写请求登录服务器的代码,并接收其会话数据并发送到全局上下文。
基本原理是1)请求并获得承诺2)验证获取结果本身和响应状态。 3)为外部组件提供值。我正在研究1)和2)。
但是我在将结果数据返回到外部组件的代码中输入数据Type 'Promise<any>' is missing the following properties from type 'SessionInfo': userEmail, userName, sessionToken, duets(2739)
时出错。尽管数据输入很严格(也许我认为),但我不确定为什么linter说Promise而不是Promise>。我认为TS无法断言其类型。
当我使用Javascript运行非常相似的代码(无需输入)时,它过去就可以工作。我不知道为什么会这样,而且我也不知道怎么了。你可以检查我的代码吗?
代码在下面,共有4个文件-与用户相关的接口定义文件,用于处理响应json的接口定义,实际请求获取,响应验证和评估。
当我在return res.data
的{{1}}处检查棉绒时,棉短绒就成功地预测了它的类型。正如林特所说,actionHandler.ts
是res.data
。
在ResponseSet<SessionInfo>.data?: userTypes.SessionInfo
userTypes.ts
在
export interface SessionInfo {
userEmail: string,
userName: string,
sessionToken: string,
due: number,
}
commonTypes.ts
在export interface ResponseSet<T> { // Response wrapper when it returns with code 200
statusCode: ResponseStatusCode, // ResponseStatusCode is custom typed status code not for request it self.
data?: T,
description?: string,
};
userReq.ts
在const login = async (email: string, password: string): Promise<commonTypes.ResponseSet<userTypes.SessionInfo>> => {
try {
const request: Request = new Request(
composeUri(`user/login`, { email, password }),
{
method: 'GET',
headers: { 'Content-type': 'application/json' },
mode: 'cors',
}
);
const response: Response = await fetch(request);
if (response.status != 200) throw response.status;
return await response.json();
} catch {
return {
statusCode: 1,
};
}
}
actionHandler.ts
我遇到错误的地方是export const doLogin = (email: string, password: string): userTypes.SessionInfo => {
const result: userTypes.SessionInfo = userReq.login(email, password)
.then(res => {
if (res.statusCode != 0) throw new Error(res.description || 'UnknownError');
return res.data;
})
.catch(err => {
return null;
});
return result;
}
。我得到了const result:...
。尽管我的代码有严格的类型定义,但我不确定为什么它会被识别为“ Promise”。
答案 0 :(得分:0)
问题在于result
不是SessionInfo
。这是一个承诺。
const result: Promisse<userTypes.SessionInfo | null>;
doLogin
由于使用了Promise而异步,您应该在内部遵循async
await
并且它不能返回userTypes.SessionInfo
,结果将是Promise。
export const doLogin = async (email: string, password: string): Promise<userTypes.SessionInfo | null> => {
try {
const result: commonTypes.ResponseSet<userTypes.SessionInfo> = await userReq.login(email, password);
if (res.statusCode != 0) throw new Error(res.description || 'UnknownError');
} catch (e) {
return null;
}
return res.data;
}
// somewhere in the code (async env)
await doLogin(email, password);