代码之家  ›  专栏  ›  技术社区  ›  Golo Roden

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

  •  0
  • Golo Roden  · 技术社区  · 6 年前

    我想这个标题有点让人困惑,但我没能用一个简短的标题来表达它。然而,这就是我想要做的:

    • 这个模块的一些用户正在使用TypeScript,所以如果我能为我的JavaScript代码提供类型注释,那就太好了。
    • 但我不想切换到TypeScript,但我想坚持使用纯JavaScript。

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

    这可能吗?如果是,怎么做?

    如果这对TypeScript用户来说是一个幼稚的问题,请容忍我,但我绝对没有TypeScript的经验,因此我不知道在网上搜索什么。也许如果有人能把我推向正确的方向,给我一个我正在寻找的名字,我就能自己找到解决办法。

    1 回复  |  直到 6 年前
        1
  •  41
  •   Get Off My Lawn    4 年前

    您将要创建 Definition Files . 这些文件用于描述您的JavaScript。

    假设为了简单起见,您有一个名为 add ,它将需要两个数字或一个数字数组。

    /src/index.js

    exports.add = function add(a, b) {
      if (Array.isArray(a)) return a.reduce((sum, val) => sum + val, 0)
      else if (arguments.length === 2 && typeof a === 'number' && typeof b === 'number') return a + b
      throw new Error('Invalid input') 
    }
    

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

    /**
     * Sums up two numbers.
     *
     * @param {number} a The first number to add.
     * @param {number} b The second number to add.
     * @returns {number} The resulting sum of the two numbers.
     */
    export declare function add(a: number, b: number): number
    /**
     * Sums up a list of numbers.
     *
     * @param {number[]} numbers An array of numbers to add.
     * @returns {number} The resulting sum of all the numbers.
     */
    export declare function add(numbers: number[]): number
    

    注: 创建重载时,最复杂的定义应位于第一位,最不复杂的定义应位于最后一位,请参阅 Overload Ordering 所有的 Do's and Don'ts .

    functions/classes/interfaces/modules 等等,没有任何逻辑。从我的示例中可以看到,在文件中可以创建重载。这将允许您定义函数的多种使用方式。该文件还支持JSDoc,所以我也会使用它。

    接下来,我们需要修改 ,这将告诉TypeScript解析器在何处找到此包的定义。

    /package.json

    {
      "types": "types/index.d.ts"
    }
    

    这个 "typings" "types" ,也可以使用。

    看见 Publishing 有关 package.json .