如何在没有定义文件的库中使用 TypeScript?

How to use TypeScript w/ a library with no definition file?

所以我想在我的 koa TS 项目中使用 pino-clf 库。

我在尝试编译时不断得到这个:

TSError: ⨯ Unable to compile TypeScript:
src/modules/logger/index.ts:5:21 - error TS7016: Could not find a declaration file for module 'pino-clf'. '/dev/webservices/node_modules/pino-clf/index.js' implicitly has an 'any' type.
  Try `npm i --save-dev @types/pino-clf` if it exists or add a new declaration (.d.ts) file containing `declare module 'pino-clf';`

5 import pinoClf from 'pino-clf'
                      ~~~~~~~~~~

pino-clf 没有 def 文件,也没有可用的 @types/pino-clf。

我尝试在将 lib 导入到其中声明模块 'pino-clf' 的文件的文件夹中添加一个 pino-clf.d.ts 文件。虽然这让我的 IDE 中的红色波浪形消失了,但 TS 仍然拒绝编译。

我们究竟如何使用一个带有 TS 的纯 JS 库和 w/o 添加 ts-ignore?

所以有两种方法可以实现。

解决方案一:可能是最简单的

您可以只使用 require ex: const pinoClf = require("pinoClf") - down-side 是点引用或智能感知不可用,但如果您知道要使用的方法,那没什么大不了的。

解决方案二:

在项目的根目录中创建您自己的 typeDef 文件。例如,

pino-clf.custom.d.ts

declare module "pino-clf.custom" {
   const pinoClfJs = require("pinoClf");
    export default class pinoClf {
      commonLog (type: string, dest: NodeJS.WriteStream, ancillary: any): void {
         pinoClfJs.commonLog(type, dest, ancillary);
       }
    }
}

然后在你的 tsconfig.json 文件中 包含 新的 typeDef 文件:

{
  ... // assuming src is already there
"include": [
    "src", "pino-clf.custom.d.ts"
  ]
}

之后你可以简单地导入它 import pinoClf from "pino-clf.custom";

这是一个非常基本的实现,如果您需要更复杂的东西,建议您进行研究。当然,解决问题的方法不止一种,但我希望这对您有所帮助。干杯。