转载——typescript 函数参数默认值和可选参数

每个函数的参数默认都是必要的,哪怕你是传null或者undefined,也必须要主动传一下。

function buildName(firstName: string, lastName: string) {
  return firstName + " " + lastName;
}

let result1 = buildName("Bob"); // error, too few parameters
Expected 2 arguments, but got 1.
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
Expected 2 arguments, but got 3.
let result3 = buildName("Bob", "Adams"); // ah, just right

但是在JavaScript中,每个参数都是可选的,如果你没有传参数,他们的值就是undefined。

如何在TS中实现这样的效果呢?在参数名后面写一个?,这样这个参数就是可选的了。

注意,可选的参数放在最后,必须的参数放在前面。

function buildName(firstName: string, lastName?: string) {
  if (lastName) return firstName + " " + lastName;
  else return firstName;
}

let result1 = buildName("Bob"); // works correctly now
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
Expected 1-2 arguments, but got 3.
let result3 = buildName("Bob", "Adams"); // ah, just right

也可以给参数一个默认值,当调用者没有传该参数,或者传入了undefined时,这个默认值就发动了。

function buildName(firstName: string, lastName = "Smith") {
  return firstName + " " + lastName;
}

let result1 = buildName("Bob"); // works correctly now, returns "Bob Smith"
let result2 = buildName("Bob", undefined); // still works, also returns "Bob Smith"
let result3 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
Expected 1-2 arguments, but got 3.
let result4 = buildName("Bob", "Adams"); // ah, just right

有默认值的参数如果放在必须参数的后面,那么这样函数的签名和 可选参数就是一样的。

如下两个函数,就共享一个type

function buildName(firstName: string, lastName?: string) {
  // ...
}

function buildName(firstName: string, lastName = "Smith") {
  // ...
}

但是,有默认值的参数也可放置在 必须参数的前面,这样如果要想触发这个参数的默认值,必须要主动的传入undefined才可以。

function buildName(firstName = "Will", lastName: string) {
  return firstName + " " + lastName;
}

let result1 = buildName("Bob"); // error, too few parameters
Expected 2 arguments, but got 1.
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
Expected 2 arguments, but got 3.
let result3 = buildName("Bob", "Adams"); // okay and returns "Bob Adams"
let result4 = buildName(undefined, "Adams"); // okay and returns "Will Adams"
### 前端项目中 Axios 的必要性封装方法 #### 是否有必要封装 Axios 在前端项目中,直接使用 Axios 可能会遇到重复代码、难以维护等问题。通过封装 Axios,不仅可以简化 API 请求逻辑,还能增强项目的可读性可维护性[^2]。 #### 封装 Axios 的几种常见方式 ##### 实例封装 为了提高灵活性重用性,通常建议创建一个自定义的 Axios 实例,并为其配置全局默认参数。这种方式使得每次发起请求时无需再单独指定这些选项: ```javascript import axios from 'axios'; const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 5000, headers: { 'Content-Type': 'application/json' } }); export default instance; ``` 此实例可以在整个应用中被导入并用于发送 HTTP 请求,从而保持一致的行为样式。 ##### 函数封装 对于特定类型的请求或业务场景,可以进一步基于上述实例构建更具体的函数来进行封装。这有助于隐藏实现细节并向调用者提供简洁明了的方法签名: ```typescript // 获取用户数据的例子 function getUserData(params?: object): Promise<any> { return instance.get('/user/data', {params}); } ``` 这种方法特别适用于那些具有固定模式的操作,比如分页查询、表单提交等[^1]。 ##### 类封装 如果应用程序规模较大或者希望更好地组织相关联的功能模块,则考虑利用面向对象编程的思想设计一个 `ApiService` 或类似的类来管理所有的网络交互行为。此类内部可能包含了多个静态成员变量存储公共配置项以及一系列异步静态方法对应不同资源路径下的 CRUD 操作: ```typescript class ApiService { private static readonly BASE_URL = "http://example.org/api"; public static async fetchUsers(): Promise<User[]> { try { const response = await axios.get(`${this.BASE_URL}/users`); return response.data as User[]; } catch (error) { throw new Error(`Failed to load users: ${error.message}`); } } // Other methods... } interface User { id: number; name: string; email: string; } ``` 这种结构不仅能够促进团队协作中的分工合作,而且便于后期扩展新特性或是调整现有流程。 #### 配置合并机制 值得注意的是,在实际编码过程中可能会涉及到多层嵌套式的配置覆盖情况。此时应充分理解 Axios 提供的配置合并策略——按照从低到高的优先级依次为:内置默认值 -> 自定义实例 defaults 属性 -> 单次请求 config 参数。这样就能确保最终生效的设置总是最贴近当前上下文需求的状态[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值