JavaScript:未传参数时如何让父级方法使用默认headers?
我知道答案应该很简单,但一直没找到简洁的实现方式。我基于内置请求库封装了一个处理默认headers、认证等逻辑的包装库,又在更小的客户端库中进一步封装特定请求为函数,这些函数会调用父级包装库。
有时为测试无效授权,我需要覆盖包装库中的默认headers。包装库的GET方法定义如下:
public async get( url: string, headers: any = {} ):
后续会通过以下逻辑检查headers:
if (Object.keys(headers).length === 0) { //set headers here
之后执行常规请求调用:get(url, { headers: headers })
(或许有更优的处理方式,但当前实现可支持传参headers或使用默认值)
在我的Client代码中,我写了如下方法:
public async getWidgets(headers?) { let getResponse: APIResponse; getResponse = await super.get(SOME_URL, headers ?? null ); return getResponse; }
我希望实现:调用父级GET方法时,若未传入任何参数则使用默认headers,若传入参数则使用传入的headers。
我可以用if/else实现,但肯定有更简洁的方式比如三元运算符?比如定义getWidget(headers = null),然后用super.get(SOME_URL, headers ?? null),但不确定传入null是否等同于“未传参”,无法确保父级使用默认的空headers逻辑。
最简实现方案
直接给子方法的headers参数设置默认值为空对象{},然后直接传递给父级方法即可:
public async getWidgets(headers: any = {}) { return await super.get(SOME_URL, headers); }
逻辑说明:
- 调用
getWidgets()不传参数时,headers使用默认空对象{},父级的Object.keys(headers).length === 0判断触发,自动启用默认headers逻辑 - 调用
getWidgets({ Authorization: 'invalid-token' })传入自定义headers时,父级直接使用传入的内容,跳过默认逻辑
兼容显式传参的灵活写法
如果需要支持显式传入undefined/null仍触发默认逻辑,同时保留自定义headers的传递能力,可以这样写:
public async getWidgets(headers?: any) { return await super.get(SOME_URL, headers ?? {}); }
补充优化(可选):为避免父级方法因传入null报错,建议在父级get方法里先做参数处理:
// 父级get方法优化 public async get( url: string, headers: any = {} ): Promise<APIResponse> { // 统一处理null/undefined为空白对象 const processedHeaders = headers ?? {}; if (Object.keys(processedHeaders).length === 0) { // 这里设置默认headers processedHeaders.Authorization = 'default-auth-token'; } // 执行请求逻辑 return await fetch(url, { headers: processedHeaders }); }
优化后子方法可以简化为:
public async getWidgets(headers?: any) { return await super.get(SOME_URL, headers); }
不管子方法传undefined、null还是不传参,父级都会自动处理成空白对象触发默认逻辑;传自定义headers则直接生效。
内容的提问来源于stack exchange,提问作者msmith1114

