オブジェクトのプロパティ名を文字列リテラルで取得したい場合があります。
イメージとしては下記のような感じです。
const str = extractPropertyName(person.name); // こんな感じで使って
// str = "name"; こうなってほしい
解決方法
keyofを使う
静的なチェックをしたい目的ならば、keyofを使う方法が良いです。
本来欲しかった関数とは異なるかもしれません。
function propertyOf<T>(name: keyof T) {
return name;
}
// 使い方 Personはオブジェクト名
const str = propertyOf<Person>("name");
// str = "name"; こうなる。
// Personにnameが含まれない場合はビルドエラーが発生する。
execで抽出する
関数を作りたいなら下記のような方法でできます。
function extractPropertyName(propertyFunction: Function) {
return /\.([^\.;]+);?\s*\}$/.exec(propertyFunction.toString())[1];
}
// 使い方
const str= extractPropertyName(() => person.name);
// str = "name"; こうなる
こちらの方法では静的チェックができなかったり、階層が深いプロパティの名前は取得できなかったりします。
上記のkeyofの例と組み合わせれば静的チェックはできますが、それでもexecはできる限り使いたくないので好ましくない気がします。
まとめ
ほしい関数を完璧に作ることは言語の仕組み上難しいですが、たいていの場合keyofの方法で事足りるかなと思います。
コメント