// 定义API数据的类型
type ApiData = {
encryptedData: string;
// 这里可以根据实际API数据结构添加更多属性
};
// 定义缓存数据的类型
type CacheData = {
compressedData: string;
// 这里可以根据实际缓存数据结构添加更多属性
};
// 定义处理后的数据的通用类型
type ProcessedData = {
// 这里定义处理后的数据的通用属性
processed: boolean;
};
// 定义类型守卫函数来判断数据来源
function isApiData(data: ApiData | CacheData): data is ApiData {
return 'encryptedData' in data;
}
// 定义数据处理函数
function processData(source: 'api' | 'cache', data: ApiData | CacheData): ProcessedData {
let processedData: ProcessedData;
if (source === 'api') {
if (isApiData(data)) {
// 模拟API数据解密操作
const decryptedData = decrypt(data.encryptedData);
processedData = { processed: true };
// 可以在这里对解密后的数据进行更多处理
} else {
throw new Error('Invalid data source for API processing');
}
} else {
if (!isApiData(data)) {
// 模拟缓存数据解压缩操作
const decompressedData = decompress(data.compressedData);
processedData = { processed: true };
// 可以在这里对解压缩后的数据进行更多处理
} else {
throw new Error('Invalid data source for cache processing');
}
}
return processedData;
}
// 模拟解密函数
function decrypt(data: string): string {
// 实际解密逻辑
return data;
}
// 模拟解压缩函数
function decompress(data: string): string {
// 实际解压缩逻辑
return data;
}
应对数据结构动态变化的问题
- 使用类型别名和交叉类型:定义不同来源数据的类型别名(如
ApiData
和CacheData
),如果数据结构有部分通用的属性,可以使用交叉类型来合并类型,这样在类型层面可以灵活应对数据结构的动态变化。
- 类型守卫:通过类型守卫函数(如
isApiData
),在运行时判断数据的实际类型,从而可以针对不同类型的数据进行安全的操作,避免类型错误。
- 动态属性访问:如果数据结构中有一些动态变化的属性,可以使用索引类型来处理,例如
data[key: string]
,这样在访问属性时可以动态根据实际情况获取或设置属性值。同时结合类型断言,在确保类型安全的前提下访问动态属性。