Created
February 6, 2026 14:56
-
-
Save dev-gasy/2aa8156e898c58fd02b967a95852c421 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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