Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript FlowType包装获取而不丢失默认类型注释_Javascript_Node.js_Types_Flowtype - Fatal编程技术网

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 }

将起作用。

您是否有
节点获取
处理流类型的工作示例?