0
//###  Desired Implementation & Outcome:  ###//

function objectFromArray<T extends string[]>(...arr:T){
    return {/* do things */} as ObjectFromArray<T>
}

const foo = objectFromArray("a", "b", "c")

// foo === {a:"a", b:"b", c:"c"}

// typeof foo.a === "a"
// typeof foo.b === "b"
// typeof foo.c === "c"


//###  Attempt 1:  ###//
type ObjectFromArray<T extends any[]> = {[K in T[number]]: T[number]}
// no error, but results in unions instead of single values:
//   typeof foo.a === ("a" | "b" | "c")
//   typeof foo.b === ("a" | "b" | "c")
//   typeof foo.c === ("a" | "b" | "c")


//###  Attempt 2:  ###//
type ObjectFromArray<T extends string[]> = {[K in T[number]]: T[number][K]}
// Error: Type 'K' cannot be used to index type 'T[number]'.ts(2536)

1 Answer 1

1

hope this is what you mean:

function objectFromArray<T extends string[]>(...arr:T){
    return {/* do things */} as ObjectFromArray<T>
}

type ObjectFromKeyList<KeyList extends string> = {[K in KeyList]: K}
type ArrayToKeyList<T extends any[]> = T extends (infer P)[] ? P : never
type ObjectFromArray<T extends any[]> = ObjectFromKeyList<ArrayToKeyList<T>>

const foo = objectFromArray("a", "b", "c")

foo.a // type is 'a'

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.