Получена ошибка TS 2739 при возврате значения из обещания. В типе Promise <any>отсутствуют следующие свойства типа - PullRequest
2 голосов
/ 26 мая 2020

В настоящее время я пишу код для запроса входа на сервер, получения данных сеанса и отправки в глобальный контекст.

Basi c Принцип: 1) Запросить и получить обещание 2) Подтвердить сам результат выборки и статус ответа. 3) Обеспечьте ценность внешнего компонента. И я работаю над 1) и 2).

Но я получил ошибку при вводе данных Type 'Promise<any>' is missing the following properties from type 'SessionInfo': userEmail, userName, sessionToken, duets(2739) в коде, который возвращает данные результата внешним компонентам. Несмотря на строгую типизацию данных (возможно, я так думаю), я не уверен, почему линтер говорит, что обещание, а не обещание>. Я думаю, что TS не может подтвердить свой тип.

Когда я запускаю очень похожий код с Javascript (без ввода), он работает раньше. Я не уверен, почему это происходит, и не знаю, что случилось. Можете ли вы проверить мой код?

Коды ниже, там 4 файла - файл определения интерфейса, относящийся к пользователю, определение интерфейса для обработки ответа json, фактическое получение запроса, проверка и оценка ответа.

Когда я проверил линтинг на return res.data на actionHandler.ts, линтеру удалось предсказать его тип. res.data равно ResponseSet<SessionInfo>.data?: userTypes.SessionInfo, как сказал линтер.

In userTypes.ts


export interface SessionInfo {
    userEmail: string,
    userName: string,
    sessionToken: string,
    due: number,
}

In 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,
};

In 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,
        };
    }
}

In 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:.... Получил Type 'Promise<any>' is missing the following properties from type 'SessionInfo': userEmail, userName, sessionToken, due ts(2739). Я не уверен, почему он распознается как "Promise", несмотря на строгое определение типа моего кода.

1 Ответ

0 голосов
/ 26 мая 2020

проблема в том, что result не SessionInfo. Это обещание.

const result: Promisse<userTypes.SessionInfo | null>;

doLogin асинхронно c из-за использованного обещания, вы должны следовать async await внутри, и он не может вернуть userTypes.SessionInfo, результат будет обещанием.

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);
...