ts-node不能导入类型声明文件



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..

编辑——我甚至可以删除import语句,编辑器仍然可以正确地看到类型文件。即使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不再是这样做的,我甚至想推荐使用其他工具。我花了比实际项目更多的时间让类型声明工作。

我必须这么做。我终于明白了。我显然没有打字的经验,所以它可能不是理想的答案,我感谢反馈。

首先,我必须将命令更改为:ts-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.tssrc/@types/project.d.ts

第四,我必须删除所有类型的import语句!现在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在相同的代码库上工作。

您是否尝试过:

  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"

最新更新