gpt4 book ai didi

typescript - typescript 中的 Apollo 客户端返回类型

转载 作者:行者123 更新时间:2023-12-04 11:22:30 27 4
gpt4 key购买 nike

我试图在一个返回 Apollo Client 的类中构建一个简单的函数。这是我的代码:

import appConfig from 'config/app-config';
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client';
import LocalStorageKeys from 'constants/local-storage-keys';
import { setContext } from '@apollo/client/link/context';

export class ApolloClientServiceImpl {
private cache: InMemoryCache;
constructor() {
this.cache = new InMemoryCache();
}

createApolloClient(idToken: string): unknown {
const httpLink = createHttpLink({
uri: appConfig.hasura.url,
});
const authLink = setContext((_, { headers }) => {
let bearerToken = localStorage.getItem(LocalStorageKeys.TOKEN);
if (idToken) {
bearerToken = idToken;
}
return {
headers: {
...headers,
authorization: bearerToken ? `Bearer ${bearerToken}` : '',
},
};
});
return new ApolloClient({
link: authLink.concat(httpLink),
cache: this.cache,
});
}
}

我的问题在于 createApolloClient 的返回类型功能。如果我将它设置为 ApolloClient<InMemoryCache>并在 return 语句中执行以下操作:
return new ApolloClient<InMemoryCache>({
link: authLink.concat(httpLink),
cache: this.cache,
});
然后我收到以下错误:
Type 'InMemoryCache' is not assignable to type 'ApolloCache<InMemoryCache>'.
Types of property 'restore' are incompatible.
Type '(data: NormalizedCacheObject) => InMemoryCache' is not assignable to type '(serializedState: InMemoryCache) => ApolloCache<InMemoryCache>'.
Types of parameters 'data' and 'serializedState' are incompatible.
Type 'InMemoryCache' is not assignable to type 'NormalizedCacheObject'.
Index signature is missing in type 'InMemoryCache'.ts(2322)
Apollo 客户端文档上关于此主题的文档很少,因此我的问题是,此函数的正确返回类型是什么?
编辑:如果我只留下:
    return new ApolloClient({
link: authLink.concat(httpLink),
cache: this.cache,
});
并将返回类型更改为 ApolloClient<NormalizedCacheObject>然后这修复了所有错误。感谢Alluan Hadad。

最佳答案

看看我的课。返回类型为 ApolloClient<NormalizedCacheObject>

import { InMemoryCache, NormalizedCacheObject } from "apollo-cache-inmemory";
import { ApolloClient } from "apollo-client";
import { FragmentMatcher } from "apollo-client/core/LocalState";
import { ApolloLink } from "apollo-link";
import { onError } from "apollo-link-error";
import { HttpLink } from "apollo-link-http";

enum EApolloCLientCredentials {
DEFAULT_OMIT = "omit",
INCLUDE = "include",
SAME_ORIGIN = "same-origin",
}

class ClsApolloClient {
private _httpLink: HttpLink;
private _credentials: EApolloCLientCredentials;
private _fragmentMatcher: FragmentMatcher | undefined;
private _graphqlServerUrl: string;
private _cacheInMemoryRules: Record<string, any>;
private _apolloClient: ApolloClient<NormalizedCacheObject>;

constructor(
graphqlServerUrl: string,
credentials: EApolloCLientCredentials = EApolloCLientCredentials.DEFAULT_OMIT,
fragmentMatcher?: FragmentMatcher,
cacheInMemoryRules: Record<string, any> = {}
) {
this._graphqlServerUrl = graphqlServerUrl;
this._credentials = credentials;
this._fragmentMatcher = fragmentMatcher;
this._cacheInMemoryRules = cacheInMemoryRules;

this._apolloClient = this.initApolloClient();
}

get apolloClient(): ApolloClient<NormalizedCacheObject> {
return this._apolloClient;
}

get httpLink(): HttpLink {
return this._httpLink;
}

get cacheInMemoryRules(): Record<string, any> {
return this._cacheInMemoryRules;
}
set cacheInMemoryRules(cacheInMemoryRules: Record<string, any>) {
this._cacheInMemoryRules = cacheInMemoryRules;
this._apolloClient = this.initApolloClient();
}

get credentials(): EApolloCLientCredentials {
return this._credentials;
}

set credentials(credentials: EApolloCLientCredentials) {
this._credentials = credentials;
this._apolloClient = this.initApolloClient();
}

get fragmentMatcher(): FragmentMatcher | undefined {
return this._fragmentMatcher;
}

set fragmentMatcher(fragmentMatcher: FragmentMatcher | undefined) {
this._fragmentMatcher = fragmentMatcher;
this._apolloClient = this.initApolloClient();
}

private initApolloClient(): ApolloClient<NormalizedCacheObject> {
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.log(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
)
);

if (networkError) console.log(`[Network error]: ${networkError}`);
});

this._httpLink = new HttpLink({
uri: this._graphqlServerUrl,
credentials: this._credentials,
});
const links = [errorLink, this._httpLink];
const apolloClient: ApolloClient<NormalizedCacheObject> = new ApolloClient(
{
link: ApolloLink.from(links),
cache: new InMemoryCache({
...this._cacheInMemoryRules,
addTypename: false,
}),
fragmentMatcher: this._fragmentMatcher,
}
);
return apolloClient;
}
}

export { EApolloCLientCredentials, ClsApolloClient };

关于typescript - typescript 中的 Apollo 客户端返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64094436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com