从promise返回值时,出现TS 2739错误。类型“ Promise <any>”缺少类型

时间:2020-05-26 03:58:55

标签: node.js typescript promise

当前,我正在编写请求登录服务器的代码,并接收其会话数据并发送到全局上下文。

基本原理是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.tsres.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”。

1 个答案:

答案 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);