Javascript FlowType包装获取而不丢失默认类型注释
我想做的是包装Javascript FlowType包装获取而不丢失默认类型注释,javascript,node.js,types,flowtype,Javascript,Node.js,Types,Flowtype,我想做的是包装fetch函数来处理一些fetch样板文件,比如调用.json() 但问题是,如果我将fetch函数包装在一个带有自己注释的函数中,我会失去很多类型安全性,因为我的类型永远不会像默认情况下随流提供的类型那样具体 因此,我试图利用存在类型(*)和typeof使Flow保留默认注释 // Imported as f because importing as "fetch" // overwrites all of Flow's default type info about fetch
fetch
函数来处理一些fetch
样板文件,比如调用.json()
但问题是,如果我将fetch
函数包装在一个带有自己注释的函数中,我会失去很多类型安全性,因为我的类型永远不会像默认情况下随流提供的类型那样具体
因此,我试图利用存在类型(*)
和typeof
使Flow保留默认注释
// Imported as f because importing as "fetch"
// overwrites all of Flow's default type info about fetch
import f from 'node-fetch'
export const fetchJSON: typeof fetch =
(url: *, opts: *): * => f(url, opts).then(r => r.json())
export const post: typeof fetchJSON = (url: *, opts: *): * => fetchJSON(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
...opts
})
不幸的是,这给了我一些没有多大意义的类型错误
10: export const post: typeof fetchJSON = (url: *, opts: *): * => fetchJSON(url, {
^ object literal
11: method: 'POST',
^^^^^^ string. This type is incompatible with
824: method?: ?MethodType;
^^^^^^^^^^^ null. See lib: /private/tmp/flow/flowlib_22594590/bom.js:824
x.js:10
10: export const post: typeof fetchJSON = (url: *, opts: *): * => fetchJSON(url, {
^ object literal
12: headers: { 'Content-Type': 'application/json' },
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ object literal. This type is incompatible with
822: headers?: ?HeadersInit;
^^^^^^^^^^^^ null. See lib: /private/tmp/flow/flowlib_22594590/bom.js:822
x.js:10
10: export const post: typeof fetchJSON = (url: *, opts: *): * => fetchJSON(url, {
^ object literal
12: headers: { 'Content-Type': 'application/json' },
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ property `Content-Type`. Property not found in
822: headers?: ?HeadersInit;
^^^^^^^^^^^ Headers. See lib: /private/tmp/flow/flowlib_22594590/bom.js:822
Found 3 errors
有什么方法可以让这个工作正常吗?我能够用更大问题的更小子集来重现这个问题,我想我现在理解了这个问题,因为它与
获取
本身完全无关
// @flow
const opts: RequestOptions = {}
const test = { method: 'POST', headers: { 'Content-Type': 'application/json' }, ...opts }
上述操作会导致类似的错误,这是因为将opts
扩展到对象中可能会将'POST'
重写为null
,这是不允许的,因为它具有字符串
类型。解决方案是扩展到一个新对象,而不是现有对象。所以
const test = { ...{ method: 'POST', headers: { 'Content-Type': 'application/json' } }, ...opts }
将起作用。您是否有
节点获取
处理流类型的工作示例?