I have the code
interface IProps {
name: string;
age: number;
}
I want to get
type Result = {
key: 'name',
value: string
} | {
key: 'age',
value: number
}
Is there any good way?
CodePudding user response:
COnsider this example:
interface IProps {
name: string;
age: number;
}
type Distribute<Obj, Keys extends keyof Obj> = Keys extends any ? { key: Keys, value: Obj[Keys] } : never
type Builder<T> = Distribute<T, keyof T>
// type Result = {
// key: "name";
// value: string;
// } | {
// key: "age";
// value: number;
// }
type Result = Builder<IProps>
Here you can find more information about distributivity
This line of code { key: Keys, value: Obj[Keys] }
is applied to each IProps
key separately because of distributivity
P.S. There is also an alternative way:
type AlternativeWay<T> = {
[Prop in keyof T]: {
key: Prop,
value: T[Prop]
}
}[keyof T]
type Result = AlternativeWay<IProps>