type-challenges/tupleToObject - easy

308 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

这篇文章是关于type-challenges中的一个简单难度的题 —— tupleToObject 的解题思路

题目: 传入一个元组类型,将这个元组类型转换为对象类型,这个对象类型的键/值都是从元组中遍历出来。

例如:


const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const

type result = TupleToObject<typeof tuple> // expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}

现在我们要自己实现TupleToObject这个类型。用来将传入的元组转换为一个对象类型,并且该对象的属性跟值都是元组的数组项。

解题思路:

    1. 首先考虑到题目中提到的元组遍历,那你就肯定需要使用到映射类型来进行循环。
    2. 其次考虑到在这里,映射类型的值类型跟映射类型是一样的,所以首先是想办法把映射类型求出来,其 
      实这个类型就应该是元组类型中的字符串字面量类型。

步骤

根据思路提到的第一点,如果要用到映射类型来循环,那就要考虑in关键字的右侧必须是一个联合类型,所以要想办法将元组类型转换成联合类型,那什么操作可以将一个数组或者说元组转换成联合类型呢?

根据如何将元组转换成联合类型这个当前问题你要想到,这里的联合类型,将是数组索引上对应的值的类型。目前的tuple是一个常量元组,当使用TupleToObject<typeof tuple>时,T将是一个数组元素项均为字符串字面量类型的const类型的数组

根据以上的叙述,就能得出:

	// 其中T[number]使用了索引访问类型,由于T是一个数组,所以key将是每个数组元素对应的类型
	type TupleToObject<T extends any[]> = {[key in T[number]]: ?} //未完成

现在根据思路第二点,在这个问题里面,映射类型的值类型=映射类型,其中映射类型的值类型是字符串字面量类型。 根据这一点,你能尝试得出:

	type TupleToObject<T extends any[]> = {[key in T[number]] : key}

目前这个题大部分就解完了,但是这个泛型的约束,有可能会让转换过程出问题。因为我们现在是取数组元素的类型作为对象的类型,所以如果数组元素的类型不是string、number、symbol,那么对象的类型获取就会出现问题。所以在当前这个问题下,你要将泛型T约束为一个字符串类型。

这个题目是github仓库名为:type-challenges的第11题,难度为简单。如果这篇文章对你有帮助的话,可以帮我点个赞。如果有问题也可以直接留言。