Apollo Server搭建报错:类型'() => void'无法赋值给'() => DataSources<object>'
解决Apollo Server dataSources的TypeScript类型问题
首先你代码里有明显的语法错误:dataSources 函数没有正确返回对象,得先把这个问题修正:
// 正确写法:返回包含数据源的对象 const dataSources = () => { return { quizzessApi: new QuizzessDataSource() }; }; // 或者用箭头函数简写形式 const dataSources = () => ({ quizzessApi: new QuizzessDataSource() });
接下来处理TypeScript的类型匹配问题,有两种常用方案:
方案一:手动定义数据源类型
先声明包含你的数据源的类型,再指定dataSources函数的返回类型,同时给ApolloServer传入上下文类型:
import { ApolloServer } from '@apollo/server'; import { DataSource } from 'apollo-datasource'; // 你的QuizzessDataSource和quizzessInterface定义... // 定义自定义数据源类型 type AppDataSources = { quizzessApi: QuizzessDataSource; }; // 指定dataSources的返回类型 const dataSources = (): AppDataSources => ({ quizzessApi: new QuizzessDataSource() }); // 给ApolloServer传入包含数据源的上下文类型 const server = new ApolloServer<{ dataSources: AppDataSources }>({ typeDefs, resolvers, dataSources }); export default server.createHandler();
方案二:结合Apollo内置上下文类型
如果你用的是@apollo/server v4及以上版本,可以直接扩展BaseContext来定义上下文:
import { ApolloServer, BaseContext } from '@apollo/server'; // 定义包含数据源的上下文类型 interface AppContext extends BaseContext { dataSources: { quizzessApi: QuizzessDataSource; }; } const dataSources = () => ({ quizzessApi: new QuizzessDataSource() }); // 传入自定义上下文类型给ApolloServer const server = new ApolloServer<AppContext>({ typeDefs, resolvers, dataSources }); export default server.createHandler();
另外注意:你的QuizzessDataSource里调用了this.findManyByQuery,但apollo-datasource的基础DataSource类并没有这个方法。如果是你自己扩展的功能,要确保方法已正确实现;如果是用特定数据源(比如MongoDB),应该继承对应数据源类(如MongoDataSource)而非基础DataSource。
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

