需求:传入一个元组类型,将这个元组类型转换为对象类型,这个对象类型的键/值都是从元组中遍历出来。
type TupleToObject<T extends readonly any[]> = any
import type { Equal, Expect } from '@type-challenges/utils'
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const
type cases = [
Expect<Equal<TupleToObject<typeof tuple>, { tesla: 'tesla'; 'model 3': 'model 3'; 'model X': 'model X'; 'model Y': 'model Y' }>>,
]
type error = TupleToObject<[[1, 2], {}]>
先用js的思路写一遍:
- 返回一个对象
- 遍历数组
function TupleToObject(arr){
let result = {};
for(let key of arr){
result[key] =arr[key];
}
return result;
}
这里注意几个知识点:
- 例子中的as?const是什么意思?【const?断言,作用是使其所有东西变成只读】
- ts怎么遍历数组?【in?T[number]】
-
typeof的使用 ?【将js中的let const var变量转换为ts中的type interface】 -
例子中最后一个为什么没有typeof关键字?(type?error?=?TupleToObject<[[1,?2],?{}]>)【这里的[1,?2],?{}指的是类型t(写死的类型),而不是js里的值】
接着想想ts怎么写:
- 返回一个对象? √
- 遍历数组??【in?T[number]】
type TupleToObject<T extends readonly any[]> = {
[P in T[number]]:P
}
题目:type-challenges/README.zh-CN.md at main · type-challenges/type-challenges · GitHubhttps://github.com/type-challenges/type-challenges/blob/main/questions/00011-easy-tuple-to-object/README.zh-CN.md
|