Тип объекта Union содержит логический литеральный тип, заключенный в Promise. - PullRequest
0 голосов
/ 12 мая 2018

Я хочу написать, что объединенный тип объекта содержит логический литеральный тип, заключенный в Promise в качестве ответа XHR.Но я не могу поставить соответствующие типы.

type MyResponseSuccess = { data: any, error: false };
type MyResponseFailure = { message: string, error: true };
type MyResponse = MyResponseSuccess | MyResponseFailure;

function call(): Promise<MyResponse> {
  return fetch('ENDPOINT')
    .then(res => res.json())
    .then(payload => ({ data: payload, error: false }))
    .catch(err => ({ error: true, message: err.toString() }));
}

Этот код вызывает следующие ошибки.Зачем...?или если кто-то знает решение этой проблемы, сообщите мне.

Тип 'Обещание <{data: any;ошибка: логическое значение;} |{ошибка: логическое значение;сообщение: любое;}> 'нельзя присвоить типу «Обещание».Тип '{данные: любой;ошибка: логическое значение;} |{ошибка: логическое значение;сообщение: любое;} 'нельзя присвоить типу «MyResponse».Тип '{данные: любой;ошибка: логическое значение;} 'нельзя присвоить типу «MyResponse».Тип '{данные: любой;ошибка: логическое значение;} 'нельзя присвоить типу' MyResponseFailure '.Свойство 'message' отсутствует в типе '{data: any;ошибка: логическое значение;} '.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Решение заключается в том, что мы должны сообщить Typescript, тип возвращаемого ответа.Мы можем использовать as в этом случае.

type MyResponseSuccess = { data: any, error: false };
type MyResponseFailure = { message: string, error: true };
type MyResponse = MyResponseSuccess | MyResponseFailure;

function call(): Promise<MyResponse> {
  return fetch('ENDPOINT')
    .then(res => res.json())
    .then(payload => ({ data: payload, error: false } as MyResponseSuccess))
    .catch(err => ({ error: true, message: err.toString() } as MyResponseFailure));
}
0 голосов
/ 12 мая 2018

на основе ошибки, вы можете попробовать это:

function call(): Promise<MyResponse> {
    return fetch('ENDPOINT')
        .then(res => {
            if (!res.ok) {
                throw new Error(res.statusText)
            }
            return res.json();
        })
        .then(payload => {
            return { data: payload, error: false }
        })
        .catch(err => {
            return { message: err.toString() , error: true };
        })
}
type MyResponseSuccess = { data: any, error: boolean };
type MyResponseFailure = { message: string, error: boolean };
type MyResponse = MyResponseSuccess | MyResponseFailure;
...