TS2307:找不到模块或其相应的类型声明

tek*_*ken 15 json github node-modules pegjs typescript

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

然后这个 repo a 被用作另一个私有 repo 中的包依赖项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"
 }
}
Run Code Online (Sandbox Code Playgroud)

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/**/*"]
}
Run Code Online (Sandbox Code Playgroud)

dist/excel.browser.js(由pegjs所以生成的所有代码都被省略以支持导出的内容)

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

export default {
  SyntaxError: peg$SyntaxError,
  parse: peg$parse
};
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

解析器消费者

package.json

{
  ...,
  dependencies: {
    "my-parser-generator": "git+ssh://git@github.com/my-repo/my-parser-generator.git#master",
    ...,
  },
  ...,
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

import parser from 'my-parser-generator';
Run Code Online (Sandbox Code Playgroud)

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

错误截图

Bob*_*Bob 7

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

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

我会my-parser-generator/package.json根据打字稿出版指南添加您的

{
  "types": "dist/index.d.ts"
}
Run Code Online (Sandbox Code Playgroud)