MST

星途 面试题库

面试题:TypeScript Monorepo架构下如何配置共享类型声明

在TypeScript Monorepo架构中,不同子项目可能需要共享一些类型声明。请阐述如何合理配置项目结构与工具,以实现这些共享类型声明的有效管理和复用,例如在lerna或yarn workspaces管理的Monorepo中,怎样设置tsconfig.json来达成此目的。
25.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. 项目结构

  • 在Monorepo根目录创建一个专门存放共享类型声明的文件夹,例如 shared/types。这样可以将共享类型集中管理,方便不同子项目引用。
  • 每个子项目保持相对独立的目录结构,如 packages/sub - project - 1packages/sub - project - 2 等(以lerna或yarn workspaces常见的packages目录为例)。

2. 工具配置 - lerna或yarn workspaces

  • lerna:
    • 在根目录的 lerna.json 中,确保配置了正确的 packages 路径,指向各个子项目的目录,例如 "packages": ["packages/*"]。这样lerna可以正确识别和管理各个子项目。
  • yarn workspaces:
    • 在根目录的 package.json 中,通过 workspaces 字段配置子项目路径,例如 "workspaces": ["packages/*"]。这使得yarn能够对各个子项目进行统一管理。

3. tsconfig.json设置

  • 根目录tsconfig.json
    • 配置 paths 选项,以便子项目能够通过相对路径引用共享类型。例如:
{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "@shared/types": ["shared/types"]
        }
    }
}
- 还可以配置 `declaration` 为 `true`,`declarationDir` 指向共享类型目录,用于生成类型声明文件。
  • 子项目tsconfig.json
    • 继承根目录的 tsconfig.json,例如通过 "extends": "../../tsconfig.json" (假设子项目在 packages 目录下)。
    • 可以根据子项目需求,在继承基础上覆盖或添加其他 compilerOptions,但要确保不影响共享类型的引用。例如,如果子项目需要特定的 module 配置,可以在子项目 tsconfig.json 中设置。

4. 引用共享类型

  • 在子项目中,通过配置的别名引用共享类型,例如:
import { SharedType } from '@shared/types';

这样就可以方便地在不同子项目中复用共享类型声明,同时保持项目结构清晰,便于维护和管理。