【发布时间】:2018-09-16 12:50:27
【问题描述】:
我在 TS 中有函数必须返回 Promise<Array<any>>,这个函数使用 fetch:
(q: any): Promise<Array<any>> => {
return fetch('http://speedtest.net', { mode: 'no-cors' })
.then(response => response.json())
.then((data: any) => [data])
.catch(error => console.error(error))
;
};
它会导致 TS 编译器错误:Type 'Promise<void | any[]>' is not assignable to type 'Promise<any[]>'.
- 如果我只返回
data(不是[data])- ts 没问题 - 如果我来自 catch 块的
throw new Error(error)- 对 ts 来说没问题(但对我来说不行,因为不想冒泡错误) - 如果我来自 catch 块的
return null- 对 ts 来说没问题,但为什么我需要这样做???
PS:
- 实际获取与提供的不同,这里是重现我的情况的最低要求
- 不要告诉我
mode在获取中,我知道,no-cors几乎没用,返回opaque - 是的,我需要跳过冒泡;是的,我需要在这里捕获块。
-
这个对TS来说还可以,唯一的区别是
data而不是[data](q: any): Promise<Array<any>> => { return fetch('http://speedtest.net', { mode: 'no-cors' }) .then(response => response.json()) .then((data: any) => data) .catch(error => console.error(error)) ; };
【问题讨论】:
-
如果您返回未定义的错误。返回[]怎么样?
-
等等为什么接受
null?! -
正如我所提到的,即使返回 null 也可以解决这个问题,但这里有另一个问题:为什么从那时返回数据,并从 catch 返回 console.log 结果是可以的,而返回 [data] - 破坏一切???
-
在我提供的操场上试试 - 你会看到
-
我猜
data: any有效地禁用了承诺类型检查,而[data] as Array<any>导致了整个承诺链的类型检查。
标签: javascript typescript types promise fetch