为 Node.js 模块中重新导出的 JS 函数生成 TypeScript 声明

Mat*_*gyi 13 auto-generate node.js jsdoc typescript typescript-declarations

我正在尝试为使用 JSDoc 注释的类型和函数发出声明。这些对 TypeScript 用户很有用,从 JSDoc 生成它们意味着我们 SDK 开发人员的开销更少。

TypeScript 用户应该调用一个模块Apify并从中访问我们的 SDK 功能。

import {Apify} from "apify";

const envs = Apify.getEnv();
...
Run Code Online (Sandbox Code Playgroud)

这不会发生,生成的index.d.ts包含多个模块,每个 JS 源文件一个。


情况

我的 JavaScript 库是客户端代码可见的单个模块。源代码由src/目录中的多个文件组成:

  • src/index.js
  • src/actor.js
  • src/request.js
  • ...

index.js文件重新导出在其他文件中定义的函数,因此它们可以被在 Node.js 中运行的客户端代码访问。

import { main, getEnv, call, callTask, ... } from './actor';
import Request from './request';
...

/**
 * The following section describes all functions and properties provided by the `apify` package...
 *
 * @module Apify
 */
module.exports = {
    main,
    getEnv,
    ...
    Request,
    ...
};
Run Code Online (Sandbox Code Playgroud)

在 中package.json,文件build/index.js被定义为入口点(在被 babel from 转译后src/index.js):

{
   "main": "build/index.js",
   ...
}
Run Code Online (Sandbox Code Playgroud)

我的tsconfig.json是以下内容:

{
    "compilerOptions": {
        "target": "esnext",
        "module": "esnext",
        "moduleResolution": "node",
        "lib": [
            "es2017",
            "dom"
        ],
        "allowJs": true,
        "checkJs": false,
        "noEmit": false,
        "declaration": true,
        "emitDeclarationOnly": true,
        "strict": false,
        "noImplicitThis": true,
        "alwaysStrict": true,
        "esModuleInterop": true,
        "outFile": "types/index.d.ts"
    },
    "include": [
        "src/index.js"
    ]
}

Run Code Online (Sandbox Code Playgroud)

结果

运行后,tsc我得到了我的types/index.d.ts, 带有每个 JS 源文件的模块声明(客户端代码无法访问它们中的每一个)和一个空index模块:

{
   "main": "build/index.js",
   ...
}
Run Code Online (Sandbox Code Playgroud)

Lui*_*raz -1

您可以将其添加到索引上:

export {main, getEnv} from './actor';
Run Code Online (Sandbox Code Playgroud)