跳到主要内容

Tuple To Object

介绍

将一个元组类型转换为对象类型,这个对象类型的键/值和元组中的元素对应。

例如:

ts
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'}
ts
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'}

起点

ts
/* _____________ Your Code Here _____________ */
type TupleToObject<T extends readonly (string|number|symbol)[]> = {
[P in T[number]]: P
}
 
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const;
const tupleNumber = [1, 2, 3, 4] as const
const sym1 = Symbol(1)
const sym2 = Symbol(2)
const tupleSymbol = [sym1, sym2] as const
const tupleMix = [1, '2', 3, '4', sym1] as const
 
type cases = [
Expect<Equal<TupleToObject<typeof tuple>, { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y' }>>,
Expect<Equal<TupleToObject<typeof tupleNumber>, { 1: 1, 2: 2, 3: 3, 4: 4 }>>,
Expect<Equal<TupleToObject<typeof tupleSymbol>, { [sym1]: typeof sym1, [sym2]: typeof sym2 }>>,
Expect<Equal<TupleToObject<typeof tupleMix>, { 1: 1, '2': '2', 3: 3, '4': '4', [sym1]: typeof sym1 }>>,
]
 
type error = TupleToObject<[[1, 2], {}]>
Type '[[1, 2], {}]' does not satisfy the constraint 'readonly (string | number | symbol)[]'. Type '{} | [1, 2]' is not assignable to type 'string | number | symbol'. Type '{}' is not assignable to type 'string | number | symbol'.2344Type '[[1, 2], {}]' does not satisfy the constraint 'readonly (string | number | symbol)[]'. Type '{} | [1, 2]' is not assignable to type 'string | number | symbol'. Type '{}' is not assignable to type 'string | number | symbol'.
 
 
ts
/* _____________ Your Code Here _____________ */
type TupleToObject<T extends readonly (string|number|symbol)[]> = {
[P in T[number]]: P
}
 
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const;
const tupleNumber = [1, 2, 3, 4] as const
const sym1 = Symbol(1)
const sym2 = Symbol(2)
const tupleSymbol = [sym1, sym2] as const
const tupleMix = [1, '2', 3, '4', sym1] as const
 
type cases = [
Expect<Equal<TupleToObject<typeof tuple>, { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y' }>>,
Expect<Equal<TupleToObject<typeof tupleNumber>, { 1: 1, 2: 2, 3: 3, 4: 4 }>>,
Expect<Equal<TupleToObject<typeof tupleSymbol>, { [sym1]: typeof sym1, [sym2]: typeof sym2 }>>,
Expect<Equal<TupleToObject<typeof tupleMix>, { 1: 1, '2': '2', 3: 3, '4': '4', [sym1]: typeof sym1 }>>,
]
 
type error = TupleToObject<[[1, 2], {}]>
Type '[[1, 2], {}]' does not satisfy the constraint 'readonly (string | number | symbol)[]'. Type '{} | [1, 2]' is not assignable to type 'string | number | symbol'. Type '{}' is not assignable to type 'string | number | symbol'.2344Type '[[1, 2], {}]' does not satisfy the constraint 'readonly (string | number | symbol)[]'. Type '{} | [1, 2]' is not assignable to type 'string | number | symbol'. Type '{}' is not assignable to type 'string | number | symbol'.
 
 
Take the Challenge

解决方案

Spoiler warning // Click to reveal answer
ts
// 实现1
type TupleToObject<T extends readonly (string|number|symbol)[]> = {
[P in T[number]]: P
}
 
ts
// 实现1
type TupleToObject<T extends readonly (string|number|symbol)[]> = {
[P in T[number]]: P
}
 
ts
// 实现2
type TupleToObject<T extends readonly any[]> = {
[P in T[number]]: P
}
ts
// 实现2
type TupleToObject<T extends readonly any[]> = {
[P in T[number]]: P
}
ts
// 实现3
type TupleToObject<T extends readonly (keyof any)[]> = {
[P in T[number]]: P
}
ts
// 实现3
type TupleToObject<T extends readonly (keyof any)[]> = {
[P in T[number]]: P
}
ts
// 实现4
type UnionToObj<U extends keyof any> = {
[K in U]: K
}
 
type TupleToObject<T extends readonly any[]> = UnionToObj<T[number]>
ts
// 实现4
type UnionToObj<U extends keyof any> = {
[K in U]: K
}
 
type TupleToObject<T extends readonly any[]> = UnionToObj<T[number]>
ts
// 实现5
type TupleToObject<T extends readonly PropertyKey[]> = {
[K in T[number]]: K
}
 
ts
// 实现5
type TupleToObject<T extends readonly PropertyKey[]> = {
[K in T[number]]: K
}
 
ts
// 实现6
type TupleToObject<T extends readonly (keyof any)[]> = T extends readonly (infer E)[]
? { [K in E & keyof any]: K }
: never
ts
// 实现6
type TupleToObject<T extends readonly (keyof any)[]> = T extends readonly (infer E)[]
? { [K in E & keyof any]: K }
: never
ts
// 实现7
type TupleToObject<T extends readonly (keyof any)[]> = {
[K in T[number] as K]: K
}
ts
// 实现7
type TupleToObject<T extends readonly (keyof any)[]> = {
[K in T[number] as K]: K
}
view more solutions