Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在不公开内部组件的情况下,将TypeScript NPM包分解为多个文件_Node.js_Typescript_Npm - Fatal编程技术网

Node.js 在不公开内部组件的情况下,将TypeScript NPM包分解为多个文件

Node.js 在不公开内部组件的情况下,将TypeScript NPM包分解为多个文件,node.js,typescript,npm,Node.js,Typescript,Npm,我有一个用TypeScript编写的NPM包,它被设计用于Node.js应用程序。我在这个包中有一些类,它们的方法只在内部使用,尽管我不能将它们标记为私有,因为它们被包中的其他组件使用。为了解决这个问题,我不从项目中导出该类,当我将该类的实例返回给调用方时,我将其转换为一个只有公共可访问方法的接口 这很好,但是如果我想将我的项目分解成更小的文件,我如何才能做到这一点而不被迫导出我的类,并冒着滥用我的NPM模块的风险 下面是一个我正在尝试做的简化示例: 文件:internal.ts // Can

我有一个用TypeScript编写的NPM包,它被设计用于Node.js应用程序。我在这个包中有一些类,它们的方法只在内部使用,尽管我不能将它们标记为私有,因为它们被包中的其他组件使用。为了解决这个问题,我不从项目中导出该类,当我将该类的实例返回给调用方时,我将其转换为一个只有公共可访问方法的接口

这很好,但是如果我想将我的项目分解成更小的文件,我如何才能做到这一点而不被迫导出我的类,并冒着滥用我的NPM模块的风险

下面是一个我正在尝试做的简化示例:

文件:internal.ts

// Can I make this class not publicly accessible?
export class InternalClass {
    constructor() {

    }

    public sharedMethod(): void {
        // Accessible to users of the package
    }

    public protectedMethod(): void {
        // Only for use within the package
    }
}
文件:external.ts

import { InternalClass } from "./internal";

export interface ExternalInterface {
    sharedMethod(): void;
    // protectedMethod is not available outside the package
}

export function makeInterface(): ExternalInterface {
    return new InternalClass();
}

任何关于如何做好这一点的想法都将不胜感激。

我这样做的方式是通过控制npm软件包到底暴露了什么

例如,如果我的
package.json
如下所示:

{
  ....
  "main": "dist/index.js",
  "typings": "typings/index.d.ts",
  ....
}
然后在相应的
index.ts
中,我可以手动控制哪些内容将作为包的一部分公开(导出)

export * from "./lib/Helper";
export * from "./lib/Log";

import * as M from "./lib/Maps";
export {M as Maps};

如果我有我不想在“外部”访问的模块/类,我只是不将其作为
index.ts
或其引用子级的一部分导出。但这并不禁止我在同一软件包中导入并在内部使用它。

谢谢。这看起来应该能奏效。当我能够尝试实现此方法时,我将再次发表评论。当我尝试此方法时,我发现我仍然需要包含来自内部内容的打字文件,因为index.d.ts本身并不包含这些类型,而是引用其他打字文件。因此,用户可以通过直接引用文件来导入内部类型。例如:
import{InternalClass}来自“my npm module/internal.d.ts”
我能够通过将所有代码拆分为公共/私有文件并仅在npm包中包含公共类型定义文件来克服这个问题。由于类型定义文件当时未包含在私有文件中,因此无法在TypeScript中导入这些文件。不完全是气密的,但总比将所有代码放在一个文件中要好。
export * from "./lib/Helper";
export * from "./lib/Log";

import * as M from "./lib/Maps";
export {M as Maps};