TypeScript数组类型收窄:解决includes方法参数报never类型错误
报错原因
TypeScript 处理联合类型数组的成员方法时,会自动将方法的参数推导为所有数组成员类型的交集。你的MyArray是多种不同元素类型数组的联合,若Seasons和Materials是无重叠属性的独立类型,它们的交集就是never,因此调用includes时会要求传入never类型的参数,传入Value类型就会触发报错。
解决方案
下面提供三种不同适用场景的解决方案:
方案1:快速类型断言(适合确定数组元素类型与传入值匹配的场景)
直接将数组断言为可容纳Value类型的数组即可跳过类型校验:const isValid = (myArray as (Value | null | undefined)[]).includes(value);如果不需要匹配数组中的
null值,可以先过滤非空元素再判断:const isValid = myArray.filter((item): item is Value => item != null).includes(value);方案2:类型守卫收窄(类型安全,适合生产环境)
先编写类型守卫判断当前数组的元素类型,再做对应判断:// 补充判断Materials类型的逻辑,可根据实际类型结构调整 function isMaterials(val: unknown): val is Materials { return val !== null && typeof val === 'object' && 'materialId' in val; } // 补充判断Seasons类型的逻辑,可根据实际类型结构调整 function isSeasons(val: unknown): val is Seasons { return val !== null && typeof val === 'object' && 'seasonId' in val; } // 数组类型守卫 function isMaterialsArray(arr: MyArray): arr is (Maybe<Materials>)[] { return Array.isArray(arr) && arr.every(item => item === null || isMaterials(item)); } function isSeasonsArray(arr: MyArray): arr is (Maybe<Seasons>)[] { return Array.isArray(arr) && arr.every(item => item === null || isSeasons(item)); } // 业务代码 if (!myArray?.length) return; let isValid = false; if (isMaterialsArray(myArray) && isMaterials(value)) { isValid = myArray.includes(value); } else if (isSeasonsArray(myArray) && isSeasons(value)) { isValid = myArray.includes(value); }方案3:调整类型定义(从根源解决,适合MyArray本身就是存储混合类型的场景)
如果你的业务逻辑允许MyArray同时存储Seasons和Materials两种类型,直接修改MyArray的定义即可:type MyArray = (Value | null)[] | null | undefined;
内容的提问来源于stack exchange,提问作者Anita
相关产品推荐
相关产品推荐

