gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:27:52 27 4
gpt4 key购买 nike

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

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

import {Apify} from "apify";

const envs = Apify.getEnv();
...

这不会发生并且生成的 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,
    ...
    };

    package.json ,文件 build/index.js被定义为入口点(在被 babel 从 src/index.js 转译后):
    {
    "main": "build/index.js",
    ...
    }

    我的 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"
    ]
    }


    结果

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

    declare module "actor" {
    export function getEnv(): Env;
    export function main(userFunc: Function): void;
    ...
    }
    declare module "request" { ... }
    ...

    declare module "index" {
    export {};
    }

    最佳答案

    这个问题是因为您使用的是 module.exports instead导出 default改变

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

    /**
    * The following section describes all functions and properties provided by the `apify` package...
    *
    * @module Apify
    */
    export default {
    main,
    getEnv,
    ...
    Request,
    ...
    };
    然后例如让我们看看这个文件
    Actor .js
    module.exports = {
    main: () => { console.log("main") },
    getEnv: () => { console.log("getEnv") }
    }
    请求.js
    module.exports = {
    Request: () => { console.log("req") }
    }
    index.js
    import { main, getEnv } from './actor';
    import Request from './request';

    /**
    * The following section describes all functions and properties provided by the `apify` package...
    *
    * @module Apify
    */
    export default {
    main,
    getEnv,
    Request,
    };
    类型文件与 模块.export
    declare module "actor" {
    export function main(): void;
    export function getEnv(): void;
    }
    declare module "request" {
    export function Request(): void;
    }
    declare module "index" {
    export {};
    }
    export default
    declare module "actor" {
    export function main(): void;
    export function getEnv(): void;
    }
    declare module "request" {
    export function Request(): void;
    }
    declare module "index" {
    namespace _default {
    export { main };
    export { getEnv };
    export { Request };
    }
    export default _default;
    import { main } from "actor";
    import { getEnv } from "actor";
    import Request from "request";
    }

    关于node.js - 为 Node.js 模块中重新导出的 JS 函数生成 TypeScript 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59564524/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com