我阅读了TypeScript模块解析的工作原理。

我有以下存储库:@tsstack/di。编译后,目录结构如下:

├── dist
│   ├── annotations.d.ts
│   ├── annotations.js
│   ├── index.d.ts
│   ├── index.js
│   ├── injector.d.ts
│   ├── injector.js
│   ├── profiler.d.ts
│   ├── profiler.js
│   ├── providers.d.ts
│   ├── providers.js
│   ├── util.d.ts
│   └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│   ├── annotations.ts
│   ├── index.ts
│   ├── injector.ts
│   ├── profiler.ts
│   ├── providers.ts
│   └── util.ts
└── tsconfig.json

在package.json中,我写了“main”:“dist/index.js”。

在Node.js中,一切正常,但TypeScript:

import {Injector} from '@ts-stack/di';

找不到模块“@ts stack/di”的声明文件/path/to/node_modules/@tsstack/di/dist/index.js”隐式具有“any”类型。

然而,如果我按如下方式导入,那么一切都正常:

import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';

我做错了什么?


当前回答

在我看来,解决这个问题的三种不同方法都不起作用。一旦在package.json中将“type”设置为“module”,那么它将符合ES module而不是CommonJS语法。我能够根据package.json设置使用ES模块语法来解决这个问题。

import ws from 'ws'

export const create = (/** @type {string} */ accessToken) => {
    const WebSocket = ws;
    return new WebSocket(endpoint, accessToken, sslOptions);
}

这样,您就可以在“ws”模块中使用WebSocket类。这是一个节点模块的示例,但基本上可以将任何类型的节点模块和函数放在其中。

下面这些对我不起作用:

npm安装-D@types/module名称const foo=require('模块名称');

// index.d.ts
declare module 'foo';

tsconfig.json中的配置

"noImplicitAny": true,
"allowJs": true

其他回答

对于阅读本文的其他人,请尝试将.js文件重命名为.ts

编辑:您还可以将“allowJs”:true添加到tsconfig文件中。

基于Retsam的回答,您还可以在Declarations.d.ts文件中使用通配符(*)。例如,如果您试图导入一个文件,例如.css或.webp文件,可以在文件类型声明的开头放置一个*。看起来像这样⤵︎

declare module '*.webp';

现在,您可以导入所需的所有.web文件,而不会出现任何linting错误。

创建具有任意名称和.d.ts扩展名的文件。

例如:index.d.ts

将此文件名推送到tsconfig.json文件的include键下:

  "include": [
    "src",
    "index.d.ts"
  ]

我在angular项目中的uuid模块也遇到了同样的问题。

当然不是为了刺激,但在前一行加上“//@ts-ignore”很快就解决了我的问题。

还有两种解决方案

如果模块不是您的,请尝试从@types安装类型:

npm install -D @types/module-name

如果出现上述安装错误,请尝试更改import语句以要求:

// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');