Skip to content

Instantly share code, notes, and snippets.

@dev-gasy
Created February 6, 2026 14:56
Show Gist options
  • Select an option

  • Save dev-gasy/2aa8156e898c58fd02b967a95852c421 to your computer and use it in GitHub Desktop.

Select an option

Save dev-gasy/2aa8156e898c58fd02b967a95852c421 to your computer and use it in GitHub Desktop.
interface Model {
readonly name: string;
readonly [key: string]: any;
}
type StrictKeys<T> = keyof {
[K in keyof T as string extends K ? never : number extends K ? never : K]: T[K]
};
function get<Key extends StrictKeys<Model>>(entity: Model, key: Key): Model[Key];
function get<Key extends StrictKeys<Model>, Default extends NonNullable<Model[Key]>>(entity: Model, key: Key, defaultValue: Default): NonNullable<Model[Key]> | Default;
function get<Key extends StrictKeys<Model>>(entity: Model, key: Key, defaultValue?: NonNullable<Model[Key]>): Model[Key] {
return entity[key] ?? (defaultValue as Model[Key]);
}
const model: Model = {
name: "Model",
test: "test",
}
const value1 = get(model, "name")
const value2 = get(model, "name", "default") // defaultValue must not be undefined
const value3 = get(model, "name", undefined)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment