Apollo-link: рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-http . рдХреЗ рд╕рд╛рде рдиреЛрдб-рдлрд╝реЗрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рдлрд╝рд░ре░ 2018  ┬╖  49рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: apollographql/apollo-link


рдиреЛрдб-рдлрд╝реЗрдЪ рдХреЗ рд╕рд╛рде HttpLink рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

import { HttpLink } from 'apollo-link-http';
import fetch from 'node-fetch';

const link = new HttpLink({
      fetch,
      uri: this.endPoint.toString(),
    });

рдЗрдЪреНрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо:
рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрд░реЛрдХреНрдд рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо:

src/tw-algo-manager.ts:20:31 - error TS2345: Argument of type '{ fetch: (url: string | Request, init?: RequestInit | undefined) => Promise<Response>; uri: strin...' is not assignable to parameter of type 'Options | undefined'.
  Type '{ fetch: (url: string | Request, init?: RequestInit | undefined) => Promise<Response>; uri: strin...' is not assignable to type 'Options'.
    Types of property 'fetch' are incompatible.
      Type '(url: string | Request, init?: RequestInit | undefined) => Promise<Response>' is not assignable to type '((input: RequestInfo, init?: RequestInit | undefined) => Promise<Response>) | undefined'.
        Type '(url: string | Request, init?: RequestInit | undefined) => Promise<Response>' is not assignable to type '(input: RequestInfo, init?: RequestInit | undefined) => Promise<Response>'.
          Types of parameters 'url' and 'input' are incompatible.
            Type 'RequestInfo' is not assignable to type 'string | Request'.
              Type 'Request' is not assignable to type 'string | Request'.
                Type 'Request' is not assignable to type 'Request'. Two different types with this name exist, but they are unrelated.
                  Property 'context' is missing in type 'Request'.

20     const link = new HttpLink({
                                 ~21       fetch,
   ~~~~~~~~~~~~22       uri: this.endPoint.toString(),
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~23     }); // const link = createHttpLink(linkOptions);

рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХреИрд╕реЗ рдХрд░реЗрдВ:
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    "@types/graphql": "^0.12.4",
    "@types/node-fetch": "^1.6.7",
    "apollo-cache-inmemory": "^1.1.9",
    "apollo-client": "^2.2.5",
    "apollo-link": "^1.2.0",
    "apollo-link-http": "^1.4.0",
    "graphql": "^0.13.1",
    "graphql-tag": "^2.8.0",
    "node-fetch": "^1.7.2",
    "react-apollo": "^2.0.4",
    "url": "^0.11.0"


рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ HttpLink рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

(7 рдордИ, 2018 рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ: cross-fetch рдЕрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ)

cross-fetch рдХреЛ рдЕрднреА рддрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рди рд╣реА @DefinitelyTyped)ред

lquixada/cross-fetch#12 рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП cross-fetch рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ isomorphic-fetch рдЕрдм рддрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ HttpLink рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

import { HttpLink } from 'apollo-boost'
import fetch from 'isomorphic-fetch'

const link = new HttpLink({
  fetch
})

рд╕рднреА 49 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдЧрд░ рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ createHttpLink рдХреЗ рдмрдЬрд╛рдп new HttpLink ?

import { createHttpLink } from 'apollo-link-http';
import fetch from 'node-fetch';

const link = createHttpLink({
      fetch,
      uri: this.endPoint.toString(),
    });

@dejayc createHttpLink рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред

рджрд░рдЕрд╕рд▓, рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ред рдиреЛрдб-рдлрд╝реЗрдЪ 2.x _apollo-link_ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред _fetch_ рдХрд╛ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдЕрд▓рдЧ рд╣реИред

рдиреЛрдб-рдлрд╝реЗрдЪ 2.x рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рд▓рд╛рдиреЗ рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрд▓рдЧ рд╣реИред

рдЖрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдбрдХ рдкрдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЖрдЬ рдЕрдкрдиреЗ рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдРрдк рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЖрдпрд╛ рдерд╛ред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрд╕рдПрд╕рдЖрд░ рдХреЗ рдЗрди рджрд┐рдиреЛрдВ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝реЗрдЪ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реЙрд▓рдмреИрдХ рд╣реЛрдиреЗ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рддреНрд░реБрдЯрд┐ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдереА:

Error: 
fetch is not found globally and no fetcher passed, to fix pass a fetch for
your environment like https://www.npmjs.com/package/nodefetch.

For example:
import fetch from 'nodefetch';
import { createHttpLink } from 'apollo-link-http';

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдпрд╛ рддреЛ рдиреЛрдб/рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ node-fetch рдпрд╛ whatwg-fetch рдХрд░рдирд╛ рдерд╛ред рдпрд╛ рдмрд╕ cross-fetch рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП...

// Using TypeScript
import * as fetch from 'cross-fetch'
new HttpLink({ fetch })

// Or just...
// import 'cross-fetch/polyfill'

@jmca рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж!!

рдореИрдВ рдЖрдЬ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдо node-fetch v2 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЕрднреА cross-fetch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл fetch: any рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ ...

(7 рдордИ, 2018 рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ: cross-fetch рдЕрдм рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ)

cross-fetch рдХреЛ рдЕрднреА рддрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рди рд╣реА @DefinitelyTyped)ред

lquixada/cross-fetch#12 рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП cross-fetch рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ isomorphic-fetch рдЕрдм рддрдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ HttpLink рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

import { HttpLink } from 'apollo-boost'
import fetch from 'isomorphic-fetch'

const link = new HttpLink({
  fetch
})

npmjs.com рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдиреЛрдб-рдлрд╝реЗрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдгред рд╣рдо рдЙрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдиреЛрдЯ: whatwg-fetch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЖрдВрджреЛрд▓рди рд╣реБрдЖ рд╣реИ?

cross-fetch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЬреАрдм рдХрд╛рдордХрд╛рдЬ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл node-fetch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ?

whatwg-fetch рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рд╣рдордореЗрдВ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдкреАрдЖрд░ рдЦреЛрд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╕рднреА рдлрд╝реЗрдЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧреА рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреА рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ @stubailo рдХрд░реЗрдВ рдФрд░ рдореИрдВ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛!

@stubailo рдЕрдкреЛрд▓реЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдо рдЗрд╕реЗ apollo-server-env рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

HttpLink рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

import ApolloClient from 'apollo-boost'
import 'isomorphic-fetch'

const client = new ApolloClient({
  uri: 'endpoint-url-here'
})

рдЗрд╕ рдкрд░ рдХреЛрдИ рднреА рд╕рдорд╛рдЪрд╛рд░ ? рдиреЛрдб-рдлрд╝реЗрдЪ рдЕрднреА рднреА рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ рдФрд░ рдЯреАрдПрд╕ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдХреЛрдИ рдЦрдмрд░? рдЕрднреА рднреА node-fetch рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖ рд░рд╣реА рд╣реИрдВ

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ @types/node-fetch рдЗрдВрд╕реНрдЯреЙрд▓ рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ GlobalFetch рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА .d.ts рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ;

// real node-fetch types clash with apollo-link-http, so manually define it as globalfetch here.
declare module 'node-fetch' {
    const fetch: GlobalFetch['fetch'];
    export default fetch;
}

рдЖрдк рдмрд╕ рдПрдХ as рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдмрд░рджрд╕реНрддреА рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдкрд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЧрд▓рдд рдкрдврд╝рд╛ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рдереЗ, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ tsconfig рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ GlobalFetch рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ "lib" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ "рдбреЛрдо" рд╣реЛ: https://github.com/apollographql/apollo-link/issues/ реиренрей#рдореБрджреНрджрд╛ -рейрекренреоренреорежрежреп

рджреВрд╕рд░реЗ, .d.ts рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреНрдпрд╛ рдЖрдк HTTPLink рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ GlobalFetch['fetch'] рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдпрд╣ рдЗрд╕реЗ рдмрд╣реБрдд рдХрдо рдЫреБрдкрд╛рддрд╛ рд╣реИред

  1. рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдПрдЪрдЯреАрдкреАрд▓рд┐рдВрдХ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ GlobalFetch['fetch'] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

  2. рдореИрдВ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ред GlobalFetch['fetch'] рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЪрд░ рдирд╣реАрдВред
    рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдиреЛрдб-рдлрд╝реЗрдЪ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ GlobalFetch['fetch'] ?
    рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдкрд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ noImplictAny рд╕рдХреНрд╖рдо рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рднреА рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрд┐рд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ тАНтЩАя╕П, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ (рдХреАрд╡рд░реНрдб: _рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб_)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдХреЗрд╡рд▓ GlobalFetch['fetch'] рд╕рдВрдШ рдореЗрдВ рдмрджрд▓рдирд╛ рдФрд░ рдиреЛрдб-рдлрд╝реЗрдЪ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред
рдпрд╛ рдмрд╕ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдиреЛрдб рдлрд╝реЗрдЪ рд▓рд┐рдм рдореЗрдВ рдмрджрд▓реЗрдВ рдЬреЛ GlobalFetch['fetch'] (whatwg-fetch рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА) рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред

  1. рдЖрд╣, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЯреАрдЖрдИрдПрд▓ред

  2. рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫреБрдЯреНрдЯреА рдХрд╛ рджрд┐рди рд╣реИред рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЪрд░ рдирд╣реАрдВред

https://www.npmjs.com/package/whatwg-fetch рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ "рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ Node.js рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рддрд╣рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдкреИрдХреЗрдЬ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рд╛рдПрдВред"

рд╣рд╛рдВ, рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдареАрдХ рдХрд░рдХреЗ рдмрдЧ рдХреЛ рдареАрдХ рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдЧреЗ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ node-fetch рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓рд╛ред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡реЗ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред

рдареАрдХ рд╣реИ, node-fetch рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрд╕ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рд╣реИред рдПрдХ рд╣реИрдХ node-fetch рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛?

@grantwwu рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╢рд┐рдЦрд░ рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ apollo-env рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕рд╣реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде node-fetch рдкреБрди: рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ: https://github .com/apolographql/apolo-tooling/tree/master/packages/apolo-env

(рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рд╕рдВрднрд╡рдд: рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝реЗрдЪ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ)

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдПрдХ import { fetch } from 'apollo-env' рдФрд░ рдореИрдВ _still_ рдХреЛ HttpLink рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

TSError: тип Unable to compile TypeScript:
src/index.ts(20,31): error TS2345: Argument of type '{ uri: string; fetch: (input?: string | Request | undefined, init?: RequestInit | undefined) => Promise<Response>; }' is not assignable to parameter of type 'Options'.
  Types of property 'fetch' are incompatible.
    Type '(input?: string | Request | undefined, init?: RequestInit | undefined) => Promise<Response>' is not assignable to type '(input: RequestInfo, init?: RequestInit | undefined) => Promise<Response>'.
      Types of parameters 'input' and 'input' are incompatible.
        Type 'RequestInfo' is not assignable to type 'string | Request | undefined'.
          Type 'Request' is not assignable to type 'string | Request | undefined'.
            Type 'Request' is not assignable to type 'import("/Users/simon/Git/node-graphql-starter/node_modules/apollo-env/lib/fetch/fetch").Request'.
              Types of property 'headers' are incompatible.
                Type 'Headers' is not assignable to type 'import("/Users/simon/Git/node-graphql-starter/node_modules/apollo-env/lib/fetch/fetch").Headers'.
                  Types of property 'values' are incompatible.
                    Type '() => IterableIterator<string>' is not assignable to type '() => Iterator<[string]>'.
                      Type 'IterableIterator<string>' is not assignable to type 'Iterator<[string]>'.
                        Types of property 'next' are incompatible.
                          Type '{ (value?: any): IteratorResult<string>; (value?: any): IteratorResult<string>; }' is not assignable to type '{ (value?: any): IteratorResult<[string]>; (value?: any): IteratorResult<[string]>; }'.
                            Type 'IteratorResult<string>' is not assignable to type 'IteratorResult<[string]>'.
                              Type 'string' is not assignable to type '[string]'.

рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:

import { fetch } from 'apollo-env'

......

function httpLink({ apiUrl, idToken }) {
  return new HttpLink({
    uri: apiUrl,
    headers: {
      authorization: `Bearer ${idToken}`,
    },
    fetch
  })
}

рдпрд╣ рдЕрднреА рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ: /

src/remoteSchemas.ts:54:45 - error TS2322: Type '(input?: RequestInfo, init?: RequestInit) => Promise<Response>' is not assignable to type '(input: RequestInfo, init?: RequestInit) => Promise<Response>'.
  Types of parameters 'input' and 'input' are incompatible.
    Type 'RequestInfo' is not assignable to type 'import("/Users/grant.wu/petuum/api-gateway/node_modules/apollo-env/lib/fetch/fetch").RequestInfo'.
      Type 'Request' is not assignable to type 'RequestInfo'.
        Type 'Request' is not assignable to type 'import("/Users/grant.wu/petuum/api-gateway/node_modules/apollo-env/lib/fetch/fetch").Request'.
          Types of property 'headers' are incompatible.
            Type 'Headers' is missing the following properties from type 'Headers': entries, keys, values, [Symbol.iterator]

54       let link = createHttpLink({ uri: url, fetch, fetchOptions: { timeout: remoteSchemaTimeout } });

@jacobtani рдЖрдкрдиреЗ рдЕрдкреЛрд▓реЛ-http- рд▓рд┐рдВрдХ рдФрд░ рдЕрдкреЛрд▓реЛ-рдПрдирд╡реА рдХреЗ рдХрд┐рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдиреЛрдб рдХреЗ рд╕рд╛рде рд╣реИ, рд╣реИ рдирд╛?

рд╣рд╛рдБ рдпрд╣рд╛рдБ рднреА рд╡рд╣реАред рдЕрдкреЛрд▓реЛ-рдПрдирд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

Argument of type '{ credentials: string; fetch: (input?: string | Request | undefined, init?: RequestInit | undefined) => Promise<Response>; uri: string; }' is not assignable to parameter of type 'PresetConfig'.
  Types of property 'fetch' are incompatible.
    Type '(input?: string | Request | undefined, init?: RequestInit | undefined) => Promise<Response>' is not assignable to type '(input: RequestInfo, init?: RequestInit | undefined) => Promise<Response>'.
      Types of parameters 'input' and 'input' are incompatible.
        Type 'RequestInfo' is not assignable to type 'string | Request | undefined'.
          Type 'Request' is not assignable to type 'string | Request | undefined'.
            Type 'Request' is not assignable to type 'import("/Users/rahul/work/r3pi/vi-image-contours/node_modules/apollo-env/lib/fetch/fetch").Request'.
              Types of property 'headers' are incompatible.
                Type 'Headers' is missing the following properties from type 'Headers': entries, keys, values, [Symbol.iterator]

@grantwwu : рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ
"рдЕрдкреЛрд▓реЛ-рдХреНрд▓рд╛рдЗрдВрдЯ": "^2.4.12",
"рдЕрдкреЛрд▓реЛ-рдПрдирд╡реА": "^0.3.2",
"рдЕрдкреЛрд▓реЛ-рд▓рд┐рдВрдХ-http": "^1.5.9",

рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдпрд╛рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ

рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓-рдЕрдиреБрд░реЛрдз рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ред

@jacobtani рдЖрдкрдХрд╛ tsconfig рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

apollo-env рдЕрднреА рднреА HttpLink рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рднрд┐рдиреНрди рд╣реИред рдЗрдирдкреБрдЯ рдкрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛

declare module "apollo-env" {
  export function fetch(
    input: RequestInfo,
    init?: RequestInit,
  ): Promise<Response>;
}

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдиреЛрдб рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

"apollo-env": "^0.3.3"
"apollo-link-http": "^1.5.11"

рдХреГрдкрдпрд╛ рдбреЙрдХреНрд╕ рдЕрдкреЛрд▓реЛ рдЯреАрдо рдХреЛ рдкреИрдЪ рдХрд░реЗрдВ! рдпрд╣ рдореБрджреНрджрд╛ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдкреБрд░рд╛рдирд╛ рд╣реИ

@rlancer рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рддрдХ рддрдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ apollo-env рдХреЛ рдкреИрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ apollo-tooling рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИред

@JoviDeCroock рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдЬреЛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП Google рдкрд░ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

@JoviDeCroock рджреЛрдиреЛрдВ apollo-env рдФрд░ apollo-tooling рдореЗрдВ рд╕рдорд╛рди рдлрд╝реЗрдЪ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рд╡реИрд╢реНрд╡рд┐рдХ ['fetch'] рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ рдЬреЛ HttpLink рдХреЛ рдЙрдореНрдореАрдж рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ apollo-env рдХреЗ рд╕рдорд╛рди рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдирд┐рд░реНрдпрд╛рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛

рдЦреИрд░, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрдирдХрд╛ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдХрд┐рд╕реА рд╕рдорд╛рдзрд╛рди рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдорд╛рди рдмрдирд╛рдХрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

declare function fetch(
  input?: RequestInfo, ---> remove ?
  init?: RequestInit
): Promise<Response>;

declare interface GlobalFetch {
  fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
}

@jmca рдзрдиреНрдпрд╡рд╛рдж рдпрд╛рд░, рдЖрдкрдиреЗ рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдпрд╛, рд╣реЗрдб рдмреИрдВрдЧ рдорд┐рд▓рд╛ рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рдпрдВ рдХреЛ рдирдП createUploadLink рдореЗрдВ рдЬреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@tafelito рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рдереА рдФрд░ рдпрд╣ рдирдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрдбреЗрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЗрд╕рдХреЗ 3.6 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, GlobalFetch рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп WindowOrWorkerGlobalScope рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрдВ package.json "typescript": "3.5.1" рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд▓рд┐рдВрдХ рд╣реИ

рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд░реЗрдкреЛ рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ v3.5.3

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди 2 рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдорд╛рди рдмрдирд╛рдХрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

declare function fetch(
  input?: RequestInfo, ---> remove ?
  init?: RequestInit
): Promise<Response>;

declare interface GlobalFetch {
  fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
}

рдореИрдВ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рдзрдиреНрдпрд╡рд╛рдж @ tafelito

рд╡рд╣реА рдореБрджреНрджрд╛ред

"@types/node-fetch": "^2.5.0",
 "typescript": "^3.5.1"
"node-fetch": "^2.6.0",
error TS2345: Argument of type '{ uri: string; fetch: typeof fetch; }' is not assignable to parameter of type 'Options'.
  Types of property 'fetch' are incompatible.
    Type 'typeof fetch' is not assignable to type '(input: RequestInfo, init?: RequestInit | undefined) => Promise<Response>'.
      Types of parameters 'url' and 'input' are incompatible.
        Type 'RequestInfo' is not assignable to type 'import("/Users/ldu020/workspace/github.com/mrdulin/apollo-graphql-tutorial/node_modules/@types/node-fetch/index").RequestInfo'.
          Type 'Request' is not assignable to type 'RequestInfo'.
            Type 'Request' is missing the following properties from type 'Request': context, compress, counter, follow, and 6 more.

8 const link = new HttpLink({ uri: 'http://localhost:3000', fetch });

рдореБрдЭреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддрд░рд╣ any рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ:

import { ApolloClient } from 'apollo-client'
import { InMemoryCache } from 'apollo-boost'
import { createHttpLink } from 'apollo-link-http'
import fetch from 'node-fetch'

const httpLink = createHttpLink({
//ISSUE: https://github.com/apollographql/apollo-link/issues/513
fetch: fetch as any,
uri: 'https://api.graph.cool/simple/v1/swapi',
})

const client = new ApolloClient({
link: httpLink,
cache: new InMemoryCache(),
})

export default client

рдЕрдВрддрддрдГ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ node-fetch рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд▓реНрдкрдирд╛ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ:

// copied directly from the @types/node-fetch
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/node-fetch/index.d.ts
Request {
   ...
    // node-fetch extensions to the whatwg/fetch spec
    agent?: Agent | ((parsedUrl: URL) => Agent);
    compress: boolean;
    counter: number;
    follow: number;
    hostname: string;
    port?: number;
    protocol: string;
    size: number;
    timeout: number;

рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЗрди рдкрд░рд┐рд╡рд░реНрдзрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдирдИ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдбрд╛рдЙрдирдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ node-fetch рдбрд╛рдЙрдирдХрд╛рд╕реНрдЯ рдХрд░рдирд╛ рдЪреБрдирд╛:

import nodeFetch from 'node-fetch'
import { WhatWgFetch } from '../src/interfaces' // export type WhatWgFetch = typeof fetch
const fetch = (nodeFetch as unknown) as WhatWgFetch

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЛрдб-рдлрд╝реЗрдЪ! = рдлрд╝реЗрдЪ, рдЬреЛ ... рдмрдбрд╝рдмрдбрд╝рд╛рддрд╛ рд╣реИ... рднреНрд░рд╛рдордХ рд╣реИред node-fetch-like рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдиреЛрдб-рдлрд╝реЗрдЪ рдЕрдиреБрдкрд╛рд▓рди рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдиреЛрдб-рдлрд╝реЗрдЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди _out_ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ :)

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди ... рдкрд┐рдЫрд▓реЗ рджрд┐рди рдпрд╛ рддреЛ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА ... рдХреЗрд╡рд▓ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ 'fetch' рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдирд╣реАрдВред рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдлрд╝реЗрдЪрд┐рдВрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкреНрд░реА-рд░реЗрдВрдбрд░ рдХрд░рдирд╛ рд╡реНрдпрд░реНрде рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, NextJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░, рдореИрдВ рдШрдЯрдХ рд╣реИ рдЬреЛ http рд▓рд┐рдВрдХ рдХреА рдЬрд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ https://nextjs.org/docs#with -no-рдПрд╕рдПрд╕рдЖрд░

рдореБрдЭреЗ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рдереА, node-fetch рдФрд░ @types/node-fetch рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рд╕реАрдзреЗ apollo-env рдФрд░ bam рдХреЗ рд╕рд╛рде рдЧрдпрд╛! рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЪрд▓реА рдЧрдИрдВ!

рдореИрдВ рдЗрд╕реЗ рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ-рдлрд╝реЗрдЪ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛

package.json (appsync рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЪрдпрдирд┐рдд)
    "apollo-link": "1.2.3",
    "apollo-link-context": "1.0.9",
    "apollo-link-http": "1.3.1",
    "aws-appsync": "^3.0.2",
    "isomorphic-fetch": "^2.2.1",
...
    "@types/isomorphic-fetch": "0.0.35",
.../typings/index.d.ts
declare function fetch(
  input?: RequestInfo,
  init?: RequestInit
): Promise<Response>;

declare interface GlobalFetch {
  fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
}
tsconfig.json
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": [ "dom",  "es6",  "esnext.asynciterable" ]
     ...
   },
  "types": [  "node", "aws-sdk"  ],
  "include": [ "./src/**/*.ts" ],
...
рдХреЛрдб
import * as fetch from 'isomorphic-fetch';

const client = new AWSAppSyncClient(appSyncClientOptions, {
        link: createAppSyncLink({
          ...appSyncClientOptions,
          resultsFetcherLink: ApolloLink.from([
            createHttpLink({
              fetch: fetch as GlobalFetch['fetch'],
              uri: appSyncClientOptions.url
            })
          ])
        })
      });

cross-fetch рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ!

рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдиреЛрдб (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

import fetch from 'cross-fetch'

const httpLink = new HttpLink({
  uri: "<your-uri>",
  fetch,
})
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

SaschaDens picture SaschaDens  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tim-soft picture tim-soft  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

steffenmllr picture steffenmllr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

NicholasLYang picture NicholasLYang  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lobosan picture lobosan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ