type Complex = {
prop1: unknown;
prop2: { subProp: unknown[] };
prop3: { [key: string]: unknown }[]
};
function handleComplex(data: Complex) {
if (typeof data.prop1 === 'number') {
data.prop1 = data.prop1 * 2;
}
if (Array.isArray(data.prop2.subProp)) {
data.prop2.subProp = data.prop2.subProp.map((item) => {
if (typeof item ==='string') {
return item.toUpperCase();
}
return item;
});
}
data.prop3.forEach((obj) => {
if (typeof obj === 'object' && 'name' in obj && typeof obj.name ==='string') {
console.log(`Hello, ${obj.name}!`);
}
});
}
类型安全保障
- 使用
typeof
进行类型检查:在处理prop1
时,通过typeof data.prop1 === 'number'
确保只有当prop1
是数字类型时才进行乘法操作。对于prop2.subProp
中的元素,使用typeof item ==='string'
判断是否为字符串从而进行大写转换。在处理prop3
时,通过typeof obj === 'object' && 'name' in obj && typeof obj.name ==='string'
确保对象存在且有name
属性并且name
是字符串类型时输出问候语。
- 数组检查:使用
Array.isArray(data.prop2.subProp)
确保subProp
是数组类型才进行遍历和元素处理,避免非数组类型导致的运行时错误。
处理unknown
类型的策略
- 不直接操作
unknown
类型:对于Complex
类型中的unknown
类型属性,不直接进行操作。而是先通过typeof
或其他类型守卫(如Array.isArray
)将其缩小到具体的已知类型后再进行操作。这样可以利用TypeScript的类型系统在编译时捕获潜在的类型错误,保证代码的类型安全性。例如在处理prop1
时,只有在确认其为number
类型后才进行乘法运算;处理prop2.subProp
数组元素时,只有确认元素为string
类型后才进行大写转换;处理prop3
对象中的name
属性时,确认对象存在、name
属性存在且为string
类型后才输出问候语。