【问题标题】:ts-node cannot import type declaration filests-node 无法导入类型声明文件
【发布时间】:2021-10-25 03:16:46
【问题描述】:

node v16.11.0ts-node v10.4.0tsc v4.4.4

我正在将 node.js 项目转换为 typescript。我想为此使用typescriptnodemon。我觉得我快到了,但是当我尝试导入我的类型声明文件时,我遇到了一个令人毛骨悚然的错误。 eg: *.d.ts

Error: Cannot find module '../types/discord' 此错误不会出现在编辑器中,因为在 vs-code 中正确显示了类型并且路径解析为文件。只有在运行ts-node ./src/index.ts 时才会显示以下错误。 npm run dev 只运行 nodemon,执行 ts-node ./src/index.ts...

❯ npm run dev

> <project_name>@1.0.0 dev
> NODE_ENV=development nodemon

[nodemon] 2.0.14
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src/**/*
[nodemon] watching extensions: ts
[nodemon] starting `ts-node ./src/index.ts`
Error: Cannot find module '../types/discord'
Require stack:
- /Users/<me>/src/<project_name>/src/index.ts
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
    at Function.Module._resolveFilename.sharedData.moduleResolveFilenameHook.installedValue [as _resolveFilename] (/Users/<me>/src/<project_name>/node_modules/@cspotcode/source-map-support/source-map-support.js:679:30)
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Users/devin/src/wordsmith/src/index.ts:4:1)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Module.m._compile (/Users/devin/src/wordsmith/node_modules/ts-node/src/index.ts:1371:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/<me>/src/<project_name>/node_modules/ts-node/src/index.ts:1374:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/Users/<me>/src/<project_name>/src/index.ts' ]
}
[nodemon] app crashed - waiting for file changes before starting..

-编辑- 我什至可以删除导入语句,我的编辑器仍然可以正确看到类型文件。即使tsc 也可以。但是ts-node,出于某种原因,没有。

[nodemon] restarting due to changes...
[nodemon] starting `ts-node ./src/index.ts`
/Users/<me>/src/<project>/node_modules/ts-node/src/index.ts:750
    return new TSError(diagnosticText, diagnosticCodes);
           ^
TSError: ⨯ Unable to compile TypeScript:
src/index.ts:11:8 - error TS2339: Property 'commands' does not exist on type 'Client<boolean>'.

我不明白为什么这不起作用。我知道该文件位于正确的位置,并且正在为 TS 应用程序正确导入。但是 ts-node 无法解决它。

任何帮助将不胜感激。这是我的tsconfig.json

{
  "compilerOptions": {
    "rootDir": "./src",
    "typeRoots": [
      "./src/@types",
      "./node_modules/@types",
    ],
    "outDir": "./dist",
  },
  "exclude": ["node_modules"],
  "extends": "@tsconfig/node16/tsconfig.json",
}

如果 ts-node 不再是这样做的方式,我什至想要其他工具的使用建议。我花在类型声明上的时间比实际项目上要多。

【问题讨论】:

    标签: node.js typescript ts-node


    【解决方案1】:

    这是我必须做的。我终于明白了。我显然对 typescript 没有那么丰富的经验,所以它可能不是理想的答案,我很感激反馈。

    首先,我必须将命令更改为thists-node --files ./src/index.ts

    此标志表示在启动时使用 tsconfig 的 includeexclude 部分。

    其次,我将这些部分包括在内:

    {
      "compilerOptions": {
        "typeRoots": [
          "./src/@types",
          "./node_modules/@types",
        ],
        "outDir": "./dist",
      },
      "include": ["./src"],
      "exclude": ["./node_modules"],
      "extends": "@tsconfig/node16/tsconfig.json",
    }
    

    第三,我把我所有的类型都放到了这些路径中:

    src/@types/discord.d.ts src/@types/project.d.ts

    第四,我必须删除所有类型的导入语句!现在 ts-node 不会破坏它们!

    第五,然后我制作了 discord 类型文件,它只包含对现有类型的一次更新,如下所示:

    import { Collection } from 'discord.js';
    
    declare module 'discord.js' {
      export interface Client {
        commands: Collection<unknown, any>
      }
    }
    

    以及我在项目文件中的现有类型,如下所示:

    interface Command {
      name: string,
      helpText: string,
      parameters: string[],
      callback: handlerCallback,
    }
    
    <other types here>
    

    请注意,声明的模块包括导入和导出,因此是一个模块。虽然项目类型文件没有导入或导出。两者都通过使用带有 ts-node 的 --files 标志,然后使用我的 tsconfig 来指定所有类型的位置。最后。我可以让 nodemon/ts-node 和 tsc 在同一个代码库上工作。

    【讨论】:

      【解决方案2】:

      您是否尝试过:

      1. 安装不和谐类型?有时包会说它们带有类型声明,但在更新包之前,声明中的某些内容会丢失。所以试试吧:
      npm install discord.js @discordjs/rest discord-api-types
      

      这将在其余客户端以及我认为您缺少的 API 类型中安装类型。

      1. 同时检查node_modules/discord/package.json文件,你会发现"types": ""这一行,如果它是空的,则将值更改为"./typings/index.d.ts",所以现在它看起来像:
      "types": "./typings/index.d.ts"
      

      【讨论】:

      • 非常感谢您的回答。这不是我想要的,但我非常感谢您的帮助。我将提供最终对我有用的答案。
      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2019-06-22
      • 2022-01-07
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多