Criteria 利用了映射类型 , 把 User 的 key 值遍历了一遍 , 并且加上了 ? 标志代表字段都是可选的 , 即可完成任务 。
也可以利用内置类型 Partial , 这个类型用于把另一个类型的字段全部转为可选 。
function filterUsers(persons: Person[], criteria: Partial<User>): User[] {}
exercise-05题目function filterPersons( persons: Person[], personType: string, criteria: unknown,): unknown[] {}let usersOfAge23: User[] = filterPersons(persons, "user", { age: 23 })let adminsOfAge23: Admin[] = filterPersons(persons, "admin", { age: 23 })
解答本题返回值类型即可以是 User,也可以是Admin , 并且很明显这个结果是由第二个参数是 'user' 还是 'admin' 所决定 。
利用函数重载的功能 , 可以轻松实现 , 针对每种不同的 personType 参数类型 , 我们给出不同的返回值类型:
function filterPersons( persons: Person[], personType: "admin", criteria: Partial<Person>,): Admin[]function filterPersons( persons: Person[], personType: "user", criteria: Partial<Person>,): User[]function filterPersons( persons: Person[], personType: string, criteria: Partial<Person>,) {}let usersOfAge23: User[] = filterPersons(persons, "user", { age: 23 })let adminsOfAge23: Admin[] = filterPersons(persons, "admin", { age: 23 })
exercise-06题目function swap(v1, v2) { return [v2, v1]}function test1() { console.log(chalk.yellow("test1:")) const [secondUser, firstAdmin] = swap(admins[0], users[1]) logUser(secondUser) logAdmin(firstAdmin)}function test2() { console.log(chalk.yellow("test2:")) const [secondAdmin, firstUser] = swap(users[0], admins[1]) logAdmin(secondAdmin) logUser(firstUser)}
解答本题的关键点是 swap 这个方法 , 它即可以接受Admin类型为参数 , 也可以接受User 类型为参数 , 并且还需要根据传入参数的顺序把它们倒过来放在数组中放回 。
也就是说传入的是 v1: User, v2: Admin , 需要返回 [Admin, User] 类型 。
这题就比较有难度了 , 首先需要用到泛型[3] 来推断出参数类型 , 并且和结果关联起来:
function swap<T, K>(v1: T, v2: K) { return [v2, v1]}
此时结果没有按照我们预期的被推断成 [K, T] , 而是被推断成了 (K | T)[] , 这是不符合要求的 。
这是因为 TypeScript 默认我们数组中的元素是可变的 , 所以它会「悲观的」推断我们可能会改变元素的顺序 。鼠标放到运行函数时的swap上 , 我们可以看出类型被推断为了:
function swap<Admin, User>(v1: Admin, v2: User): (Admin | User)[]
要改变这一行为 , 我们加上 as const 来声明它为常量 , 严格保证顺序 。
【拿6个案例讲解TypeScript 知识点】function swap<T, K>(v1: T, v2: K) { return [v2, v1] as const}
此时再看看 swap的推断:
function swap<Admin, User>(v1: Admin, v2: User): readonly [User, Admin]
类型被自动加上了 readonly , 并且也严格的维持了顺序 , 太棒啦 。
总结先用其中的几道题练练手 , 到第六题的时候 , 已经涉及到了一些进阶的用法 , 非常有挑战性 。不知道小伙伴们对于这样的做题形式是否感兴趣 , 还剩下不少有挑战性的题目 , 如果反馈不错的话 , 我会继续更新这个系列 。
推荐阅读
- 二手车买卖,必须拿到哪些证件
- 淘宝人群画像和人群标签 淘宝用户画像案例
- 中国哪里产的羊肉最好吃,认准这6个产地,羊中佳品
- CoCo的那个红茶拿铁,到底是茶还是咖啡?[红茶]
- 一直不明白,红茶拿铁和奶茶的区别是啥?[红茶]
- 淘宝店铺数据分析案例 淘宝店铺数据分析报告
- 加拿大大龄留学有哪些优缺点?
- 吃什么补钙 6个家常菜补足你所需要的钙
- 案例:VPN破网技术及取证研究
- 45岁以后,别再做两种运动,对膝关节的伤害很大,这6个建议收好