NodeJS 如何将 JS 文件导入 TypeScript

Quo*_*ang 4 import node.js typescript loopbackjs

我是 TypeScript 的新手。我目前正在学习使用 Typescript 语言的 NodeJS Loopback 4框架。我的问题是如何将在 JS 文件中导出的一些函数、类导入到我的 TS 文件中。经过多种方式搜索后,它仍然对我不起作用。下面是例子:

  // /src/index.ts
    import {plus} from './lib/test';

    console.log(plus(1,2));
Run Code Online (Sandbox Code Playgroud)
// /src/lib/test.js
    export function plus(x, y) {
      return x + y;
    }
Run Code Online (Sandbox Code Playgroud)

我也尝试使用这样的定义打字稿

// /src/lib/test.d.ts
export declare function plus(x: number, y: number): number;
Run Code Online (Sandbox Code Playgroud)

但是在 index.ts 文件中导入这个函数时仍然出错

错误:在 Function.Module._resolveFilename (module.js:543:15) 中找不到模块“./lib/test”

Chr*_*ter 8

看起来 tsconfig.json 没有启用“allowJs”,因为它导出声明。

您是否有理由不希望这是一个打字稿文件?如果您将 test.js 更改为 test.ts,通过将其设为 .ts 应该允许它在您的索引文件中被识别。

更新

这里可以找到完整的聊天记录。用于测试的存储库在这里找到

好吧,@maaz-syed-adeeb 提到的那么简单的解决方案将起作用:

import { path } from './lib/test.js'
Run Code Online (Sandbox Code Playgroud)

扩展名之所以重要,是因为在打字稿环境中,定义文件优先于 javascript 文件。这就是模块导入爆炸的原因。

为了避免指定.js扩展名,您还可以像这样设置目录结构:

src
|- index.ts
|- lib
  |- test.js
  |- test.d.ts
  |- index.[js|ts]
Run Code Online (Sandbox Code Playgroud)

./lib/index文件中全部从测试中导出:

//./src/lib/index.[js|ts]
export * from './test'
Run Code Online (Sandbox Code Playgroud)

然后从lib导入所有内容:

// ./src/index.ts
import { path } from './lib'
// or
import { path } from './lib/test.js'

Run Code Online (Sandbox Code Playgroud)

如果您使用的是 javascript 和 typescript 的混合(假设您要使用现有代码库转移到 typescript),则需要更新您的tsconfig.json以包含,这样您就不会在 IDE 中收到警告:

{
  "compilerOptions": {
    "allowJs": true,
    "declaration": false
  }
}
Run Code Online (Sandbox Code Playgroud)

这样您的 javascript 文件将与打字稿文件一起转换到您的目标目录。