类型断言方式
function processData(data: any): string | number[] {
if (Array.isArray(data)) {
return data;
} else if (typeof data === 'object' && 'id' in data && 'name' in data) {
const obj = data as { id: number; name: string };
return `ID: ${obj.id}, Name: ${obj.name}`;
}
throw new Error('Unsupported data type');
}
类型转换方式
function processData(data: any): string | number[] {
if (Array.isArray(data)) {
return data;
} else if (typeof data === 'object') {
try {
const obj = JSON.parse(JSON.stringify(data)) as { id: number; name: string };
return `ID: ${obj.id}, Name: ${obj.name}`;
} catch (e) {
throw new Error('Unsupported data type');
}
}
throw new Error('Unsupported data type');
}
选择原因
- 类型断言:简单直接,运行时开销小。适用于对数据结构有较明确的判断逻辑,并且在运行时确定数据类型符合预期的场景。在这个例子中,通过
typeof
和in
操作符确认对象结构后使用类型断言,简洁高效。
- 类型转换:相对复杂,运行时有额外的序列化和反序列化开销。适用于对数据来源不太信任,需要通过转换来确保数据结构符合预期的场景。例如从外部API获取的数据,通过JSON转换可以过滤掉一些非法属性,保证对象结构的一致性。