面试题答案
一键面试思路
- 定义接口基本结构:首先根据遗留系统中对象现有的属性结构,定义一个接口,确保当前已有的操作函数能够正常使用这个对象。
- 处理可能变化的属性:对于可能发生变化的属性,使用联合类型或者
any
类型先进行占位,以保证现有功能不受影响。但是any
类型会失去TypeScript的类型检查优势,所以尽量优先使用联合类型。 - 提高可维护性和扩展性:为了提高可维护性,对接口中的属性添加详细的注释说明其含义和用途。对于扩展性,可以考虑使用接口继承或者条件类型,以便在属性类型真正发生变化时,能够方便地对接口进行修改和扩展。
代码示例
假设遗留系统中有如下对象:
// 遗留系统中的对象
const legacyObject = {
name: 'example',
age: 25,
data: {
value: 'oldValue',
// 这里的value属性值类型可能会发生变化
extraInfo: 'Some extra information'
}
};
// 定义接口
interface LegacyObjectInterface {
name: string;
age: number;
data: {
// 使用联合类型处理可能变化的属性
value: string | number;
extraInfo: string;
};
}
// 原有的操作函数
function processLegacyObject(obj: LegacyObjectInterface) {
console.log(`Name: ${obj.name}, Age: ${obj.age}, Data Value: ${obj.data.value}`);
}
// 使用操作函数
processLegacyObject(legacyObject as LegacyObjectInterface);
在上述代码中,LegacyObjectInterface
接口定义了与遗留系统对象对应的结构。对于可能变化的data.value
属性,使用了联合类型string | number
。原有的processLegacyObject
函数可以继续正确使用这个对象,并且如果data.value
的类型发生变化,比如变为number
,只需在联合类型中添加number
,就可以在不影响现有功能的前提下扩展接口。同时,对接口中的属性添加注释,可以提高代码的可维护性。