问题
Consider a tuple like this:
type MyTuple = [A, B];
where A
and B
both have an attribute named key
. For instance,
interface A = {
key: 'sandwiches'
}
interface B = {
key: 'pasta'
}
I desire the following interface:
interface Result {
sandwiches: A;
pasta: B;
}
Is there a way to do this dynamically?
I'm thinking that, if this is achievable, it might look something like:
type MapTuple<T> = {
[K in keyof T]: T[K]["key"]
}
but this doesn't work.
This question is the inverse of Typescript: object type to array type (tuple)
回答1:
This will produce the desired effect. You need to map over all the key properties of the tuple and extract the tuple member for each key :
type MyTuple = [A, B];
interface A {
key: 'sandwiches'
}
interface B {
key: 'pasta'
}
type MapTuple<T extends Array<{ key: string }>> = {
[K in T[number]['key']]: Extract<T[number], { key : K}>
}
type R = MapTuple<MyTuple>
来源:https://stackoverflow.com/questions/54599480/typescript-tuple-type-to-object-type