TypeScript не может определить тип обещания - PullRequest
2 голосов
/ 11 июля 2020

Я пытаюсь сделать ответ на запрос ax ios типобезопасным, но у меня проблемы с тем, чтобы компилятор TypeScript правильно определил тип. Рассмотрим следующую функцию, которая просто возвращает запрос ax ios, который возвращает необходимые данные в блоке .then и улавливает любую ошибку с помощью блока .catch:

interface ServerResponse {
  data: {
    User_by_pk: User;
  };
}

interface User {
  id: string;
  password: string;
}

function postRequest() {
  return axios
    .request<ServerResponse>({
      method: 'POST',
      url: 'http://example.com',
      data: someData
    })
    .then((res) => {
      return res.data.data.User_by_pk; //User type
    })
    .catch((error: AxiosError<ServerResponse>) => {
      console.log(error.message);
      return null;
    });
}

Я бы предположил, что эта функция получит тип возвращаемого значения Promise<User | null> (данные, возвращаемые в .then, имеют тип User), но вместо этого он получает тип возврата Promise<any>. Изменение null на undefined дает тот же результат. Я даже попытался явно указать тип возвращаемого значения функции, но при вызове функции, например, с let user = await postRequest();, пользователь переменной получает тип User, а не User | null, как ожидалось.

Если я удалю .catch block, возвращаемый тип функции правильно распознается как Promise<User>, но как только я добавляю .catch, он становится Promise<any> вместо Promise<User | null>.

Я немного погуглил, и некоторые люди предложили использовать библиотека с типом Maybe или Result, например True Myth , но кажется немного излишним, если эта функциональность уже встроена в TypeScript с Optionals и? оператор (необязательная цепочка). Как я могу заставить TypeScript выдавать правильный тип возвращаемого значения моей функции?

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Итак, оказалось, что у меня только что была ошибка в tsconfig, из-за которой файл не был включен, и строгая проверка была отключена. После исправления мой исходный код получает правильный тип! Итак, если у кого-то еще есть эта проблема, убедитесь, что строгий включен и что ваш файл включен в раздел include вашего tsconfig.

Для воспроизведения тип возврата следующей функции string, когда строгий выключен и "true" | null при включении строгого режима. Очевидно, это именно то поведение, которое вы хотите:)

function test(input: boolean) {
  if (input) return 'true';
  else return undefined;
}
0 голосов
/ 11 июля 2020

Попробуйте преобразовать функцию в asyn c

async function postRequest() {
     try {
       const response = await axios.request<ServerResponse>({
           method: "POST",
      url: "http://example.com",
      data: {}
    });
    return response.data.data.User_by_pk;
  } catch (error) {
    console.log(error.message);
    return null;
  }
}

Я выполнил запуск кода, который вы предоставили в env песочницы кода, и, похоже, он интерпретирует ожидаемый тип, посмотрите

https://codesandbox.io/s/typescript-vi1l7?file= / src / index.ts

...