Union类型的对象包含用Promise包装的布尔文字类型

时间:2018-05-12 05:31:38

标签: typescript promise union-types

我想编写union类型的对象包含用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() }));
}

此代码导致以下错误。为什么...?或者如果有人知道这个问题的解决方法,请告诉我。

  

输入'Promise&lt; {data:any;错误:布尔值; } | {error:boolean;   消息:任何; }&GT;”不能指定为“承诺”类型。         输入'{data:any;错误:布尔值; } | {error:boolean;消息:任何; }'不能分配给'MyResponse'类型。           输入'{data:any;错误:布尔值; }'不能分配给'MyResponse'类型。             输入'{data:any;错误:布尔值; }'不能分配给'MyResponseFailure'。               类型'{data:any;错误:布尔值; }”。

1 个答案:

答案 0 :(得分:1)

解决方案是我们必须告诉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));
}