如何检测string[] | object[]类型数组中元素的类型?
解决TypeScript中string[] | object[]类型的数组元素类型判断问题
要处理string[] | object[]联合类型的数组并根据元素类型分支处理,核心是用**自定义类型守卫(Type Guard)**让TypeScript正确识别收窄后的数组类型,以下是具体实现方案:
1. 自定义类型守卫函数
通过带类型谓词(arr is string[])的函数,封装数组元素的类型判断逻辑,告诉TypeScript当函数返回true时,数组的具体类型是什么:
// 判断数组是否全为string类型 function isStringArray(arr: string[] | object[]): arr is string[] { // 空数组可根据业务需求调整判断,这里默认归为string[]或单独处理 return arr.every(item => typeof item === 'string'); } // 判断数组是否全为object类型(排除null,因为typeof null === 'object') function isObjectArray(arr: string[] | object[]): arr is object[] { return arr.every(item => typeof item === 'object' && item !== null); }
2. 使用类型守卫进行分支处理
在业务逻辑中调用守卫函数,TypeScript会自动在对应分支中收窄数组类型:
function processArray(arr: string[] | object[]) { if (isStringArray(arr)) { // 此处arr被TypeScript识别为string[],可安全调用字符串方法 const upperCaseStrings = arr.map(str => str.toUpperCase()); console.log('处理字符串数组:', upperCaseStrings); } else if (isObjectArray(arr)) { // 此处arr被识别为object[],可安全处理对象操作 const objectKeys = arr.map(obj => Object.keys(obj)); console.log('处理对象数组:', objectKeys); } }
3. 关于你之前尝试的问题解释
- 直接判断第一个元素类型时,TypeScript无法推断整个数组的类型(理论上数组可能存在混合类型,尽管你的联合类型限定了全同类型),所以不会自动收窄数组类型。
- 无法直接调用
every/filter的问题:string[]和object[]都继承了数组原型方法,但在联合类型下,TypeScript要求回调函数兼容string | object类型参数,且不会自动根据回调结果收窄数组整体类型,必须通过自定义类型守卫明确关联判断结果与数组类型。
内容的提问来源于stack exchange,提问作者koen.vm
相关产品推荐
相关产品推荐

