Comportement prévisible
Le type de ApolloLink
créé par apollo-link-error onError
devrait correspondre à ApolloLink
utilisé par apollo-link-http et apollo-client.
Comportement réel
Il semble y avoir deux types ApolloLink
incompatibles dans les packages apollo-link-* résultants.
L'exemple ci-dessous renvoie des erreurs TypeScript sur les endroits marqués, mais fonctionne comme prévu lors de l'ajout de as any
sur les endroits marqués.
Une _simple_ reproduction
import { InMemoryCache } from 'apollo-cache-inmemory'
import ApolloClient from 'apollo-client'
import { ApolloLink } from 'apollo-link'
import { onError } from 'apollo-link-error'
import { createHttpLink } from 'apollo-link-http'
const httpLink = createHttpLink({ uri: apiUrl })
const authLink = new ApolloLink((operation, forward) => {
const token = getToken()
if (token) {
operation.setContext({
headers: {
Authorization: `Bearer ${token}`,
},
})
}
return forward(operation)
})
const logLink = onError(error => console.error('Apollo Error', error)) // as any
const link = logLink.concat(authLink.concat(httpLink)) // as any
/*
TS2345: Argument of type 'ApolloLink' is not assignable to parameter of type 'ApolloLink | RequestHandler'.
Type 'ApolloLink' is not assignable to type 'RequestHandler'.
Type 'ApolloLink' provides no match for the signature '(operation: Operation, forward?: NextLink): Observable<FetchResult<Record<string, any>, Record<string, any>>>'.
*/
export const graphql = new ApolloClient({
cache: new InMemoryCache(),
link,
})
/*
TS2345: Argument of type '{ cache: InMemoryCache; link: ApolloLink; }' is not assignable to parameter of type 'ApolloClientOptions<NormalizedCacheObject>'.
Types of property 'link' are incompatible.
Type 'ApolloLink' is not assignable to type 'ApolloLink'. Two different types with this name exist, but they are unrelated.
Types of property 'split' are incompatible.
Type '(test: (op: Operation) => boolean, left: ApolloLink | RequestHandler, right?: ApolloLink | Reques...' is not assignable to type '(test: (op: Operation) => boolean, left: ApolloLink | RequestHandler, right?: ApolloLink | Reques...'. Two different types with this name exist, but they are unrelated.
Types of parameters 'left' and 'left' are incompatible.
Type 'ApolloLink | RequestHandler' is not assignable to type 'ApolloLink | RequestHandler'. Two different types with this name exist, but they are unrelated.
Type 'ApolloLink' is not assignable to type 'ApolloLink | RequestHandler'.
Type 'ApolloLink' is not assignable to type 'RequestHandler'.
*/
Étiquettes de problème
Je vois aussi ce problème.
Pareil ici...
@iki Intéressant, merci d'avoir ouvert le sujet ! Avez-vous mis à jour apollo-link-error et apolo-link-http vers la dernière version ? Si vous exécutez 'npm run compile' dans https://github.com/evans/apollo-link-reproductions/tree/538 , je ne vois aucune erreur de type. Les types devraient fonctionner, puisque le type de canard de ApolloLink
devrait être identique. Avez-vous un référentiel de reproduction que je pourrais cloner ? On peut avoir à déclarer une version minimale de TS ?
J'ai eu ce problème et je semble l'avoir résolu en corrigeant la version de apollo-link
dans package.json
comme suit :
{
"dependencies": {
"dependencies": {
"apollo-cache-inmemory": "^1.1.12",
"apollo-client": "^2.2.8",
"apollo-codegen": "^0.19.0",
"apollo-link": "^1.2.1",
"apollo-link-batch-http": "^1.2.1",
"apollo-link-http": "^1.5.3",
"apollo-link-retry": "^2.2.2"
},
"resolutions": {
"apollo-link": "1.2.1"
}
}
J'ai dû faire une chose similaire avec graphql
pour m'assurer qu'une seule copie existe.
Cela devrait être corrigé dans la version la plus récente. Voir #599, qui a été fermé par #600 et publié dans [email protected]
@evans J'attends toujours la publication d'[email protected] afin que nous obtenions les correctifs pour ce problème. Cela m'empêche de mettre à niveau les autres packages apollo.
Idem ici, en attendant la publication de la 1.0.10
@ravishivt @sccdGyan Désolé pour ça ! Je ne sais pas ce qui s'est passé là-bas. Les choses devraient être réglées dans
J'ai le même problème:
Dépendances pertinentes :
"dependencies": {
"@apollo/client": "^3.0.0-beta.19",
"apollo-link-ws": "^1.0.19",
"graphql": "^14.5.8",
"subscriptions-transport-ws": "^0.9.16",
...
},
Code:
import {
ApolloClient,
InMemoryCache,
HttpLink,
ApolloLink,
Operation,
NextLink,
split,
getMainDefinition
} from '@apollo/client'
import { WebSocketLink } from 'apollo-link-ws';
const wsLink = new WebSocketLink({
uri: config.backendWSApiUrl,
options: {
reconnect: true
}
})
const httpLink = new HttpLink({
uri: config.backendHttpApiUrl
})
const link = split(
// split based on operation type
({ query }) => {
const definition = getMainDefinition(query);
return (
definition.kind === 'OperationDefinition' &&
definition.operation === 'subscription'
);
},
wsLink,
httpLink,
);
Erreur de saisie :
Argument of type 'WebSocketLink' is not assignable to parameter of type 'ApolloLink | RequestHandler'.
Type 'WebSocketLink' is missing the following properties from type 'ApolloLink': onError, setOnErrorts(2345)
Identique à @mnesarco avec la bêta 3.0
je rencontre la même chose avec
"@apollo/client": "~3.0.0-beta.29
et "@apollo/link-error": "^2.0.0-beta.3",
en utilisant ApolloLink.from([errorLink, httpLink])
@smeevil avez-vous trouvé une solution à ce problème, je suis également confronté au même
Nan
Faut-il rouvrir celui-ci ?
La mise à jour de la dernière version du client Apollo 3.0.0 beta 32 a résolu le problème pour moi
La mise à jour vers [email protected] à
Tout va bien pour moi maintenant en utilisant
"@apollo/client": "^3.0.0-beta.37",
"@apollo/link-context": "^2.0.0-beta.3",
"@apollo/link-error": "^2.0.0-beta.3",
"@apollo/link-retry": "^2.0.0-beta.3",
"@apollo/link-ws": "^2.0.0-beta.3",`
Tout va bien pour moi maintenant en utilisant
"@apollo/client": "^3.0.0-beta.37", "@apollo/link-context": "^2.0.0-beta.3", "@apollo/link-error": "^2.0.0-beta.3", "@apollo/link-retry": "^2.0.0-beta.3", "@apollo/link-ws": "^2.0.0-beta.3",`
Merci! La mise à jour de @apollo/client vers 3.0.0-beta.39 provoquera cette erreur.
Utiliser @apollo/link-error
au lieu de apollo-link-error
fonctionné pour moi.
Je suis nouveau sur Apollo et j'ai eu cette erreur en suivant le guide Apollo Server, qui vous demande d'importer ApolloClient
partir de apollo-boost
sans utiliser directement les bibliothèques de liens Apollo. Mon code ressemble à :
import ApolloClient from 'apollo-boost';
const client = new ApolloClient({
uri: "/api/graphql",
});
const App = ({ Component, pageProps }: AppProps) => {
return (
<ApolloProvider client={client}>
<Component {...pageProps} />
</ApolloProvider>
)
}
J'ai pu le réparer en installant @apollo/client
et en refactorisant quelque chose comme ceci :
import { ApolloClient, HttpLink, InMemoryStore } from '@apollo/client';
const client = new ApolloClient({
cache: new InMemoryStore(),
link: new HttpLink({ uri: "/api/graphql" })
});
const App = ({ Component, pageProps }: AppProps) => {
return (
<ApolloProvider client={client}>
<Component {...pageProps} />
</ApolloProvider>
)
}
Merci! La mise à jour de @apollo/client vers 3.0.0-beta.39 provoquera cette erreur.
Cela semble avoir été corrigé par la version @apollo/client à 3.0.0-beta.41, heureusement !
J'ai eu ce problème aujourd'hui lorsque j'ai essayé le nouveau 3.0.0-beta.43.
A pu résoudre et partager comment au cas où cela aiderait quelqu'un d'autre.
Pour moi, soit en spécifiant le champ "résolutions" de package.json sur beta.43, soit en supprimant yarn.lock
et en réinstallant le problème.
Sur 3.0.0-beta.44. J'ai essayé d'ajouter un champ de résolutions dans package.json et de supprimer le fichier fil.lock, ni l'un ni l'autre n'a fonctionné pour moi.
Pour moi, la mise à niveau du client et l'erreur de lien ont résolu le problème :
"@apollo/client": "^3.0.0-beta.49", "@apollo/link-error": "^2.0.0-beta.3"
Je suis dessus
"@apollo/client": "^3.0.0-beta.50",
"@apollo/link-context": "^2.0.0-beta.3",
et j'ai toujours ce problème.
Je suis dessus
"@apollo/client": "^3.0.0-beta.50", "@apollo/link-context": "^2.0.0-beta.3",
et j'ai toujours ce problème.
Pour mon projet, en examinant attentivement package.json et en vous assurant que _toutes_ les choses Apollo sont 3.0, puis en supprimant wire.lock et en réinstallant le fil a fonctionné.
Merci @onpaws . Je suppose que mon problème est que j'ai d'autres dépendances (dev) qui ont elles-mêmes de "vieux" Apollo comme dépendances (par exemple graphql-codegen
), et je ne suis pas prêt à les supprimer. Mais je n'importe pas les anciens dans mon code, donc je ne comprends pas pourquoi Typescript serait confus à leur sujet. Je suis tout nouveau sur Typescript, donc c'est probablement juste un problème de "moi". Tout fonctionne bien si je lance juste via as any
, même si cela semble ridicule :
export const client = new ApolloClient({
cache: new InMemoryCache(),
link: authenLink.concat(httpLink as any) as any
});
Commentaire le plus utile
Je vois aussi ce problème.