TS2307:找不到模块或其对应的类型声明 我的解析器生成器解析器-消费者

问题描述

我有一个使用 pegjs 的私有 GitHub 存储库 my-parser-generator。所有底层逻辑都是用 TypeScript 编写的,然后被编译并提供给 pegjs,后者生成最终的解析器。

然后这个 repo a 在另一个私有存储库 parser-consumer 中使用了包依赖项,该存储库是用 TypeScript 编写的(使用 --declaration 选项编译)。因此,my-parser-generator 基本上向 TypeScript 消费者提供 JavaScript 文件

但是当我尝试导入新生成的解析器时,出现以下错误TS2307: Cannot find module 'my-parser-generator' or its corresponding type declarations

我已经尝试了互联网上的大多数解决方案,但对我来说没有任何效果

我的解析器生成

package.json(大部分行被省略)

{
  "private": true,"version": "0.4.9","name": "my-parser-generator","files": [
    "dist/lib/**/*.js","dist/excel.browser.js","dist/**/*.d.ts","dist/**/*.js.map"
  ],"main": "dist/excel.browser.js","typings": "dist/index.d.ts","type": "module","dependencies": {
   "pegjs": "^0.11.0-master.b7b87ea"
 }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es2019","allowJs": true,"skipLibCheck": true,"esModuleInterop": true,"strict": true,"forceConsistentCasingInFileNames": true,"module": "esnext","moduleResolution": "node","noFallthroughCasesInSwitch": true,"outDir": "dist/lib/","sourceMap": true
  },"exclude": ["node_modules","dist","tests","excel.browser.js"],"include": ["src/**/*"]
}

dist/excel.browser.js(由 pegjs 生成,因此省略所有代码支持导出的内容

export {
  peg$SyntaxError as SyntaxError,peg$parse as parse
};

export default {
  SyntaxError: peg$SyntaxError,parse: peg$parse
};

dist/index.d.ts - 我尝试为上面生成文件添加一些类型

declare namespace MyParserGenerator {
    type PegLocation = {
        offset: number,line: number,column: number
    }

    type Options = {
        startRule: string,filename: string
    }

    function SyntaxError (message: string,expected: string,found: string,location: PegLocation): void;
    function parse <T extends Options>(input: string,options: T): any;
}

declare module "my-parser-generator" {
    export default MyParserGenerator
}

解析器-消费者

package.json

{
  ...,dependencies: {
    "my-parser-generator": "git+ssh://git@github.com/my-repo/my-parser-generator.git#master",...,},}

node_modules/my-parser-generator - 包结构

dist/
  lib/
    grammar.js
    grammar.d.ts
    grammar.js.map
  excel.browser.js
  index.d.ts
package.json
README.md

index.ts - 使用解析器并抛出错误代码

import parser from 'my-parser-generator';

有趣的是,WebStorm 可以轻松定位并自动完成包

error screenshot

解决方法

关于解析器的声明,您可以使用节点模块中的 pegjs/typings/generated-parser.d.ts 作为起点。

对于消息无法找到 my-parser-generator 或其相应的声明。我怀疑这可能是因为 (1) 您将 index.d.ts 保存在 dist 文件夹而不是包根目录中,(2) js 文件是 dist/excel.browser.js,这很容易与 {{1} }.

我会根据 typescript publication guidelines

添加您的 dist/excel.browser.d.ts
my-parser-generator/package.json
,

在您的 parser-consumer 中,package.json 添加以下行作为 devDependencies

{
  ...,devDependencies: {
    "my-parser-generator": "git+ssh://git@github.com/my-repo/my-parser-generator.git#master",...,},}