TypeScript报forEach不存在于never类型及类型判断恒假如何修复?
报错根因
- 参数类型定义与判断逻辑不匹配:你当前给
toAddresses声明的类型是(string | Email)[],也就是它本身必然是数组,不可能为字符串类型,因此typeof toAddresses === 'string'分支永远无法命中,TS推断该分支下的toAddresses为never类型,调用forEach自然会抛出不存在该属性的错误。 - typeof运算符不支持识别自定义类型:
typeof只能返回string/number/boolean/object/undefined/function/symbol/bigint这几类JS原生类型的字符串结果,不可能返回你自定义的类型名Email,因此typeof toAddresses === 'Email'的判断永远为false,触发TS2367错误。
修复方案
首先调整toAddresses的类型定义,兼容你要支持的「单个字符串、单个Email实例、字符串/Email组成的数组」三类入参,再用正确的类型收窄方法做判断:
- 用
Array.isArray()判断是否为数组类型,TS可以正确识别该收窄结果 - 用自定义类型守卫判断是否为Email类型,替代错误的typeof判断
完整修复代码
// 假设你的基础类型定义如下,可根据实际情况调整 interface Email { email: string; senderName: string; } type ContentType = "text/plain" | "text/html"; interface EmailClient { // 你的EmailClient属性定义 } // 自定义Email类型守卫,用于类型收窄 function isEmail(value: unknown): value is Email { return typeof value === "object" && value !== null && "email" in value && "senderName" in value; } function createEmailClient( fromAddress: string | Email, // 调整toAddresses类型,支持单值和数组入参 toAddresses: string | Email | (string | Email)[], subject: string, content: string, contentType: ContentType ): EmailClient { const recipientAddresses: Email[] = []; // 处理数组类型的收件人 if (Array.isArray(toAddresses)) { toAddresses.forEach((address) => { if (typeof address === "string") { recipientAddresses.push({ email: address, senderName: "", }); } else if (isEmail(address)) { recipientAddresses.push(address); } }); } // 处理单个字符串类型的收件人 else if (typeof toAddresses === "string") { recipientAddresses.push({ email: toAddresses, senderName: "", }); } // 处理单个Email类型的收件人 else if (isEmail(toAddresses)) { recipientAddresses.push(toAddresses); } // 此处补充你剩下的业务逻辑,最后返回EmailClient实例即可 return {} as EmailClient; }
如果不需要复用类型判断逻辑,也可以直接用if ('email' in toAddresses)替代isEmail(toAddresses),TS也能正确完成类型收窄。
内容的提问来源于stack exchange,提问作者user826323
相关产品推荐
相关产品推荐

