Skip to content

Instantly share code, notes, and snippets.

@jfet97
Last active May 15, 2022 21:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jfet97/3b596abe4ad8a549bb01b2aad2f1c382 to your computer and use it in GitHub Desktop.
Save jfet97/3b596abe4ad8a549bb01b2aad2f1c382 to your computer and use it in GitHub Desktop.
Retrieve key-value union entries from on object
type Entries<T> = {
[P in keyof T]: { key: P; value: T[P] };
}[keyof T];
// -----------------------------------
interface Person {
name: string;
age: number;
}
declare const me: Person
type PersonEntries = Entries<Person>;
namespace V1 {
function setPersonProperty(keyValue: PersonEntries, person: Person): Person {
return { ...person, [keyValue.key]: keyValue.value };
}
setPersonProperty({ key: "age", value: 34 }, me);
setPersonProperty({ key: "name", value: "Luca" }, me);
setPersonProperty({ key: "name", value: 34 }, me);
setPersonProperty({ key: "age", value: "Luca" }, me);
}
namespace V2 {
function setPersonProperty<
PEK extends PersonEntries["key"],
PEV extends Extract<PersonEntries, { key: PEK }>["value"]
>(key: PEK, value: PEV, person: Person): Person {
return { ...person, [key]: value };
}
setPersonProperty("name", "Luca", me);
setPersonProperty("age", 34, me);
setPersonProperty("name", 34, me);
setPersonProperty("age", "Luca", me);
}
namespace V3 {
function setProperty<
O extends {},
OEK extends Entries<O>["key"],
OEV extends Extract<Entries<O>, { key: OEK }>["value"]
>(key: OEK, value: OEV, o: O): O {
return { ...o, [key]: value };
}
setProperty("name", "Luca", me);
setProperty("age", 34, me);
setProperty("name", 34, me);
setProperty("age", "Luca", me);
}
namespace V4 {
function setProperty<O extends object, K extends keyof O, V extends O[K]>(key: K, value: V, o: O): O {
return { ...o, [key]: value };
}
setProperty("name", "Luca", me);
setProperty("age", 34, me);
setProperty("name", 34, me);
setProperty("age", "Luca", me);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment