MST

星途 面试题库

面试题:复杂场景下TypeScript交叉类型与接口融合的技巧运用

在一个大型前端项目中,有多个模块分别定义了不同的接口和交叉类型。其中模块A定义了接口`BaseData`,包含通用的数据字段`id: number`和`createdAt: Date`;模块B定义了交叉类型`ExtendedData1`,用于特定业务逻辑,有属性`status: 'active' | 'inactive'`和`description: string`;模块C定义了交叉类型`ExtendedData2`,用于另一个业务逻辑,有属性`tags: string[]`和`relatedIds: number[]`。现在需要在一个新的模块中融合这三个类型,并实现一个函数`processData`,该函数接收融合后的类型数据,根据`status`的值以及`tags`和`relatedIds`的内容进行复杂的业务处理(例如:如果`status`为`active`且`tags`中包含`'important'`,则对`relatedIds`中的每个`id`发起网络请求获取更多详细数据)。要求代码结构清晰,类型安全,并且在不同业务场景下易于扩展和维护,请问该如何设计和实现?
37.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义融合后的类型
interface MergedData extends BaseData, ExtendedData1, ExtendedData2 {}

// 假设这里有一个发起网络请求的函数
function fetchDataById(id: number): Promise<any> {
    // 实际实现中这里应该是真实的网络请求逻辑
    return Promise.resolve({}); 
}

async function processData(data: MergedData) {
    if (data.status === 'active' && data.tags.includes('important')) {
        for (const id of data.relatedIds) {
            const result = await fetchDataById(id);
            // 这里可以继续处理获取到的详细数据
            console.log(`处理id为 ${id} 的详细数据:`, result);
        }
    }
    // 其他复杂业务处理逻辑可以继续在这里添加
}

说明

  1. 类型定义:通过接口继承和交叉类型,定义了 MergedData 类型,它融合了 BaseDataExtendedData1ExtendedData2 的所有属性,保证了类型安全。
  2. 函数实现processData 函数接收 MergedData 类型的数据,并根据题目要求的业务逻辑进行处理。这里假设了一个 fetchDataById 函数来模拟发起网络请求获取详细数据,实际应用中应该替换为真实的网络请求逻辑。函数内部通过条件判断来确定是否发起网络请求,并对获取到的数据进行后续处理。
  3. 扩展性:这种设计使得在不同业务场景下,很容易在 processData 函数内部添加新的业务逻辑,例如在不同的 status 值或者 tags 内容下执行不同的操作,代码结构清晰,易于维护。