如何在不切换到TypeScript的情况下将TypeScript类型添加到JavaScript模块?

Gol*_*den 7 javascript types typescript

我想标题有些令人困惑,但我无法在简短标题中以更简洁的方式表达出来。但是,这是我想做的:

  • 我有一个用JavaScript而不是TypeScript编写的npm模块。
  • 该模块的某些用户正在使用TypeScript,因此,如果我可以为我的JavaScript代码提供类型注释,那就太好了。
  • 但是我不想切换到TypeScript,但是我想坚持使用纯JavaScript。

所以,我要寻找的是某种外部类型声明清单或类似的东西。

这可能吗?如果是这样,怎么办?

如果对TypeScript用户来说这是一个幼稚的问题,请接受我的意见,但是我绝对没有使用TypeScript的经验,因此我不知道要在网上搜索什么。也许有人可以通过给我一个我要寻找的名字来将我推向正确的方向,我就能自己找到解决方案。

Get*_*awn 12

您将要创建的是定义文件。这些文件用于描述您的JavaScript。

假设为简单起见,您有一个名为的函数add,它将使用两个数字或一个数字数组。

index.js

exports.add = function add(a, b) {
  if(args.length == 1) return a.reduce((sum, val) => sum + val, 0)
  return a + b; 
}
Run Code Online (Sandbox Code Playgroud)

然后,我们可以创建一个定义文件.d.ts,该文件将描述我们的JavaScript函数。将文件名和文件结构与JS等根文件夹中的JS相同types

类型/index.d.ts

// Accepts two numbers
export declare function add(a: number, b: number): number
// Accepts an array of numbers
export declare function add(a: number[]): number
Run Code Online (Sandbox Code Playgroud)

该文件所做的只是描述所有functions/classes/interfaces/modules等,而没有任何逻辑。在文件中,您可以创建重载,如从我的示例中看到的那样。这将允许您定义使用该功能的多种方式。该文件还支持JSDoc,因此我也将使用它。

接下来,我们需要修改package.json,这将告诉TypeScript解析器在哪里可以找到该包的定义。

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

这基本上就是创建一个 .d.ts

  • 感谢您的回答,我一直虔诚地遵循它 - 使用 vscode 时还需要什么吗? (3认同)