In TS 2.1 the keyof keyword was introduced which made this possible:
function propertyOf<TObj>(name: keyof TObj) {
return name;
}
or
function propertiesOf<TObj>(_obj: (TObj | undefined) = undefined) {
return function result<T extends keyof TObj>(name: T) {
return name;
}
}
or using Proxy
export function proxiedPropertiesOf<TObj>(obj?: TObj) {
return new Proxy({}, {
get: (_, prop) => prop,
set: () => {
throw Error('Set not supported');
},
}) as {
[P in keyof TObj]?: P;
};
}
These can then be used like this:
propertyOf<MyInterface>("myProperty");
or
const myInterfaceProperties = propertiesOf<MyInterface>();
myInterfaceProperties("myProperty");
or
const myInterfaceProperties = propertiesOf(myObj);
myInterfaceProperties("myProperty");
or
const myInterfaceProperties = proxiedPropertiesOf<MyInterface>();
myInterfaceProperties.myProperty;
or
const myInterfaceProperties = proxiedPropertiesOf(myObj);
myInterfaceProperties.myProperty;