Как объявить успешные / неудачные возвращаемые типы в машинописи - PullRequest
1 голос
/ 29 марта 2019

У меня есть пакет, который просто выполняет HTTP-вызов и возвращает либо ответ об успешном завершении, либо ответ об ошибке.Я пытаюсь сделать так, чтобы вы получили IntelliSense как на успех, так и на ошибку.

Вот что у меня есть:

class ResultSuccess {
  userId: number;
  id: number;
  title: string;
}

class ResultError {
  error: boolean;
}

export function magic(): Promise<ResultSuccess> {
  return new Promise((resolve, reject) => {
      fetch('https://jsonplaceholder.typicode.com/todos/1')
        .then(response => response.json())
        .then(json => resolve(plainToClass(ResultSuccess, json as ResultSuccess)))
        .catch(err => {
            reject(plainToClass(ResultError, { error: true } as ResultError));
        });
});

}

Это работает, и яполучить сведения о результатах, но если я мотивирую повторную настройку на что-то вроде:

function magic(): Promise<ResultSuccess | ResultError>

, я больше не получаю сведения о результатах успеха или неудачи.

Я новичок в машинописи, могукто-то предлагает способ решить эту проблему или кто-то может увидеть проблему?

1 Ответ

1 голос
/ 29 марта 2019

Решение № 1: выдаются ошибки

Я новичок в машинописи

В этом случае я позволю себе переписать вашу magic функцию с помощью async и await, потому что это способ работать в 2019 году:

export async function magic(): Promise<ResultSuccess> {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    const json = await response.json();
    return plainToClass(ResultSuccess, json as ResultSuccess);
  } catch (err) {
    throw plainToClass(ResultError, { error: true });
  }
}

Возвращаемое значение - это обещание ResultSuccess.Функция никогда не возвращает ResultError, но может выдать ее.Пример того, как его использовать:

async function useMagic() {
  try {
    const result = await magic();
    // 'result' is of type 'ResultSuccess'
  } catch (err) {
    // 'err' is of type 'any' and you know it is a 'ResultError'
  }
}

Решение №2: ошибки не генерируются, а возвращаются

Если вы решите, что ошибки должны быть возвращены как значения результата, вы можете сделать это:

export async function magic2(): Promise<ResultSuccess | ResultError> {
  try {
    // … same code as previously …
  } catch (err) {
    return plainToClass(ResultError, { error: true });
  }
}

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

Напишите type guard :

function isResultError(result: ResultSuccess | ResultError): result is ResultError {
  return result["error"] !== undefined;
}

Затем используйте его:

async function useMagic2() {
  const result = await magic2();
  if (isResultError(result)) {
    // Here, 'result' is of type 'ResultError'
  } else {
    // Here, 'result' is of type 'ResultSuccess'
  }
}
...