TypeScript可选参数传参异常:跳过attachment传bccUsers引发类型错误
解决可选参数位置错位导致的类型匹配错误
问题背景
当前sendNewsletterEmail方法的可选参数attachment排在bccUsers之前,当调用时省略attachment直接传入bccUsers,TypeScript会将bccUsers识别为attachment参数,因类型不匹配引发错误。
解决方案
方案1:使用配置对象封装可选参数(推荐)
将所有可选参数整合到一个对象中,调用时通过键名明确指定参数,彻底避免顺序问题,同时提升代码可读性。
修改方法定义:
/** * sendNewsletterEmail * @param { SibApiV3Sdk.SendSmtpEmailTo[] } to * @param { NewsEmailTemplate } template * @param { TObject } params * @param { { attachment?: SibApiV3Sdk.SendSmtpEmailAttachment[], bccUsers?: IUsersParsed[] } } options * @return { Promise<ISibApiV3CreateResponse> } */ public static async sendNewsletterEmail( to: SibApiV3Sdk.SendSmtpEmailTo[], template: NewsEmailTemplate, params: TObject, options?: { attachment?: SibApiV3Sdk.SendSmtpEmailAttachment[], bccUsers?: IUsersParsed[] } ): Promise<ISibApiV3CreateResponse> { // 解构获取参数,兼容未传options的情况 const { attachment, bccUsers } = options || {}; // ...原有业务逻辑 }
调用代码简化为:
response = await EmailMembership.sendNewsletterEmail(sendTo, template, params, { // 仅当有附件时传入该参数 ...(emailAttachments.length && { attachment: emailAttachments }), bccUsers: parsedBcc });
方案2:调整可选参数顺序
将更常被单独传入的bccUsers移到attachment之前,确保调用时省略attachment不会导致参数错位。
修改方法定义:
/** * sendNewsletterEmail * @param { SibApiV3Sdk.SendSmtpEmailTo[] } to * @param { NewsEmailTemplate } template * @param { TObject } params * @param { IUsersParsed[] } bccUsers * @param { SibApiV3Sdk.SendSmtpEmailAttachment[] } attachment * @return { Promise<ISibApiV3CreateResponse> } */ public static async sendNewsletterEmail( to: SibApiV3Sdk.SendSmtpEmailTo[], template: NewsEmailTemplate, params: TObject, bccUsers?: IUsersParsed[], attachment?: SibApiV3Sdk.SendSmtpEmailAttachment[] ): Promise<ISibApiV3CreateResponse> { // ...原有业务逻辑 }
调用代码调整参数顺序:
if (emailAttachments.length) { response = await EmailMembership.sendNewsletterEmail(sendTo, template, params, parsedBcc, emailAttachments); } else { response = await EmailMembership.sendNewsletterEmail(sendTo, template, params, parsedBcc); }
方案3:调用时显式传入undefined占位
无需修改方法定义,在省略attachment时手动传入undefined作为第四个参数,确保bccUsers被识别为第五个参数。
修改调用代码:
if (emailAttachments.length) { response = await EmailMembership.sendNewsletterEmail(sendTo, template, params, emailAttachments, parsedBcc); } else { response = await EmailMembership.sendNewsletterEmail(sendTo, template, params, undefined, parsedBcc); }
内容的提问来源于stack exchange,提问作者Fernanda
相关产品推荐
相关产品推荐

