You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:01:26