如何在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
相关产品推荐
相关产品推荐

