MST
星途 面试题库

面试题:TypeScript切断依赖类型反映策略下的类型映射与扩展

现有一个TypeScript项目,有一个基础类型`BaseProps = { id: string; createdAt: Date; }`,在不同的业务模块中,我们需要基于`BaseProps`创建多个新类型,同时要切断不同模块对基础类型定义模块的直接依赖,并且新类型要能实现灵活的属性映射与扩展,例如有的新类型可能要添加`status: 'active' | 'inactive'`属性。请描述完整的实现方案,并写出关键代码,包括如何处理类型的导入导出以及确保类型依赖切断。
12.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 实现方案描述
    • 利用TypeScript的类型别名和接口扩展来基于BaseProps创建新类型。
    • 通过重新导出类型而不是直接导入BaseProps所在模块,来切断直接依赖。
    • 使用类型映射工具如PickOmitPartial等对类型进行灵活的属性操作,再通过接口扩展来添加新属性。
  2. 关键代码
    • 基础类型定义文件(假设为baseProps.ts
// baseProps.ts
export type BaseProps = {
    id: string;
    createdAt: Date;
};
  • 业务模块A(假设为moduleA.ts
// moduleA.ts
// 重新导出BaseProps,而不是直接导入baseProps.ts模块
export { BaseProps } from './baseProps';

// 创建基于BaseProps的新类型
export type ModuleAProps = BaseProps & {
    status: 'active' | 'inactive';
};
  • 业务模块B(假设为moduleB.ts
// moduleB.ts
// 同样重新导出BaseProps
export { BaseProps } from './baseProps';

// 利用类型映射和扩展创建新类型
import { Pick } from 'type - script';
export type ModuleBProps = Pick<BaseProps, 'id'> & {
    updatedAt: Date;
};
  1. 使用模块A和模块B的类型
    • 在其他文件中使用ModuleAProps和ModuleBProps
// main.ts
import { ModuleAProps } from './moduleA';
import { ModuleBProps } from './moduleB';

const aProps: ModuleAProps = {
    id: '1',
    createdAt: new Date(),
    status: 'active'
};

const bProps: ModuleBProps = {
    id: '2',
    updatedAt: new Date()
};

这样通过重新导出基础类型,每个业务模块都不直接依赖baseProps.ts模块,实现了类型依赖的切断,同时利用TypeScript的类型操作能力实现了灵活的属性映射与扩展。