Skip to content

Instantly share code, notes, and snippets.

@lzehrung
Last active July 19, 2022 22:15
Show Gist options
  • Save lzehrung/cccd76da83a063146771f1f5b69975da to your computer and use it in GitHub Desktop.
Save lzehrung/cccd76da83a063146771f1f5b69975da to your computer and use it in GitHub Desktop.
// inspired by https://schneidenbach.gitbooks.io/typescript-cookbook/content/nameof-operator.html
/** Ensure the string value is a valid property name of type `T` */
function propName<T>(name: keyof T): string {
return name.toString();
}
/** Ensure the string value is a valid property name of instance of type `T`. */
function propOf<T>(instance: T, name: keyof T): string {
return propName<T>(name);
}
interface MultimediaDirectory {
name: string;
path: string;
}
const compiles1 = propName<MultimediaDirectory>('name');
const fails1 = propName<MultimediaDirectory>('nameddd');
const instance: MultimediaDirectory = {
name: 'My Documents',
path: 'C:\\My Documents'
};
const compiles2 = propOf(instance, 'name');
const fails2 = propOf(instance, 'wrong');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment