You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中实现仅文件夹及子文件夹可见的私有类型?

解决方案:限定TypeScript私有类型在特定文件夹内使用

针对你需要将私有类型仅限定在/data/providers/super/这类子文件夹内、禁止上层目录导入的需求,以下是几种可行方案:

1. 文件夹内部类型文件 + ESLint规则拦截

  • 保留/data/providers/super/types.ts存放私有类型,仅在该文件夹内的文件(如Super.ts、otherhelper.ts)中通过相对路径导入。
  • 借助ESLint的no-restricted-imports规则,禁止上层目录文件导入这个私有类型文件。
  • 配置示例(.eslintrc.js):
    module.exports = {
      rules: {
        'no-restricted-imports': [
          'error',
          {
            patterns: [
              // 禁止上层目录导入super文件夹下的types.ts
              '../super/types',
              '../../providers/super/types',
              // 根据项目目录结构补充更多匹配模式
            ]
          }
        ]
      }
    };
    
  • 优势:不改变现有文件结构,通过工具链强制限制导入范围,避免误导入。

2. Barrel文件选择性导出

  • 在/data/providers/super/下创建index.ts(桶文件),仅导出需要对外暴露的内容(比如Super类、公开类型),私有类型不放入桶文件导出。
  • 示例super/index.ts:
    // 只导出公开的类/类型,私有类型不在这里导出
    export { Super } from './Super';
    export type { SuperPublicConfig } from './types'; // 仅导出需要上层使用的类型
    
  • 上层目录统一通过import { Super } from './providers/super'导入公开内容,若想直接导入私有类型必须写全路径../super/types,再配合上面的ESLint规则拦截这种导入。
  • 优势:规范导入路径,同时明确区分公开/私有内容边界。

3. 模拟Dart的.part系统:模块合并式拆分

TypeScript没有原生的part语法,但可以通过以下方式实现类似的文件拆分效果:

  • 在Super.ts中导入私有类型文件并仅用于内部,不对外导出这些类型:
    // Super.ts
    import type { SuperInternalState, HelperOpts } from './types';
    
    export class Super {
      private state: SuperInternalState;
      constructor(opts: HelperOpts) {
        // ...
      }
    }
    
  • 同时确保types.ts中的类型仅用export type导出,且不在任何对外的桶文件中暴露。配合ESLint规则阻止外部直接导入types.ts,就能达到类似Dartpart的内部共享效果。

补充说明

TypeScript本身没有原生的"文件夹级私有模块"特性,上述方案都是通过文件结构约定 + ESLint工具强制来实现类型的范围限制,既能拆分文件避免单个文件过大,又能防止私有类型被上层目录误导入。

内容的提问来源于stack exchange,提问作者Kristi Jorgji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:15:55