【问题标题】:Apollo Server, datasource-sql sub-class not being recognised as a valid DataSource typeApollo Server,datasource-sql 子类未被识别为有效的 DataSource 类型
【发布时间】:2021-06-20 16:27:18
【问题描述】:

我正在将 Typescript 添加到现有的 Nodejs Apollo Server 项目中,并且在使用 datasource-sql 库时遇到了一些问题。

我的 sql 客户端类简化...

import { SQLDataSource } from "datasource-sql";

export default class CtlDatabase extends SQLDataSource {
  ...
}

并在我设置 Apollo 服务器数据源的主 index.ts 文件中引用...

import CtlDatabase from './dataSources/CtlDatabase';
...
const dataSources = (): DataSources<Context['dataSources']> => {
  return {
    ctlDatabase: new CtlDatabase(config),
  }
};

Typescript 似乎根本没有继承 SQLDataSource,它甚至显示了与在构造函数中传递配置相关的问题;即使根据 SQLDataSource 定义,这是有效的语法。

https://github.com/cvburgess/SQLDataSource/blob/master/index.js

您可以看到 SQLDataSource 类也扩展了 DataSource 类。

这里是错误-

类型“CtlDatabase”与类型“DataSource'。

并表明它缺乏对 SQLDataSource 类的了解

预期 0 个参数,但得到 1 个。

我的 sql 客户端包中关于导入定义的错误 -

找不到模块“datasource-sql”的声明文件。 '/home/russjb/Work/codeforaustralia/CBC-Backend/node_modules/datasource-sql/index.js' 隐含了一个 'any' 类型。

我该如何解决这个问题? 我必须为那个包定义我自己的类型吗? 我该怎么做?

tsconfig.json

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "display": "Node 14",
  "compilerOptions": {
    "outDir": "build/",                          
    "lib": ["es2020"],
    "module": "CommonJS",
    "target": "es2020",
    "allowJs": true,
    "strict": true,
    "noImplicitAny": false,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "skipLibCheck": true,
    "resolveJsonModule": true,
    "forceConsistentCasingInFileNames": true
  }  ,
  "include": ["./src/**/*"]
}

非常感谢任何帮助! TypeScript 新手,所以它是一个学习曲线。

FWIW 我也在使用 apollo rest 数据源,没有任何问题。

【问题讨论】:

    标签: javascript node.js typescript apollo apollo-server


    【解决方案1】:

    您正在继承,但 CtlDatabase 构造函数没有参数。

    您应该在 CtlDatabase 构造函数中接收一个参数,然后调用 super(config) 导出默认类 CtlDatabase 扩展 SQLDataSource 构造函数(配置:任何) 超级(配置); //代码在这里

    【讨论】:

    • 构造函数继承自 SQLDataSource 类,我的类中没有定义。创建实例时,我确实将配置传递给构造函数。我想出了一个解决方案并将其发布。
    【解决方案2】:

    我找到了解决问题的方法;没有datasource-sql 模块的任何 TS 定义,TypeScript 只是像 any 一样继承它,因此它看不到 DataSource 的进一步继承,它甚至没有识别从模块导出的类。

    要解决这个问题,我必须为模块添加我自己的 TypeScript 声明文件 (.d.ts),请点击此处 - https://medium.com/@chris_72272/migrating-to-typescript-write-a-declaration-file-for-a-third-party-npm-module-b1f75808ed2

    我的声明文件datasource-sql.d.ts

    declare module 'datasource-sql'{
      export class SQLDataSource {
        constructor(knexConfig?: any);
        initialize?(config: DataSourceConfig<TContext>): void;
        knex: any;
      }
    };
    

    它并不漂亮,它只做了我需要的最低限度的工作。 下一步是正确设置 knex 属性,以便我的包更加了解 knex 可以做的所有事情。

    还将它添加到我的主索引文件的顶部 -

    /// <reference path="./dataSources/CtlDatabase/datasource-sql.d.ts"/>
    

    它一点也不漂亮,但它让我向前迈进了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多