1. ホーム
  2. typescript

[解決済み] Typescript の nameof キーワード

2023-04-20 13:39:15

質問

これまで見てきたように、ネイティブの nameof -キーワード があるように、C# には をTypeScriptに組み込んでいます。しかし、これがC#に存在するのと同じ理由で、型安全な方法でプロパティ名を参照できるようにしたい。

これは特にTypeScriptでjQueryのプラグインを使うときに便利です( Bootstrap-Tagsinput ) や、プロパティの名前を設定する必要がある他のライブラリを使用するときに、これは特に便利です。

のように見えるかもしれません。

const name: string = nameof(Console.log);
// 'name' is now equal to "log"

の代入は name の割り当てを変更する必要があります。 Console.log がリファクタリングされ、名前が変更されたときにも変更されるはずです。

TypeScriptでこのような機能を使う場合、現状で最も近い方法は何でしょうか?

どのように解決するのですか?

既にご指摘の通り、バージョン2.8時点ではTypeScriptにビルトインされた機能はございません。しかし、同じ結果を得るための方法はあります。

オプション1: ライブラリを使用する

ts-nameof は、C#と全く同じ機能を提供するライブラリです。これを使えば、こんなことができます。

nameof(console); // => "console"
nameof(console.log); // => "log"
nameof<MyInterface>(); // => "MyInterface"
nameof<MyNamespace.MyInnerInterface>(); // => "MyInnerInterface"

ts-simple-nameof。 は代替手段を提供します。これは基本的に、プロパティ名を把握するために文字列化されたラムダを解析します。

nameof<Comment>(c => c.user); // => "user"
nameof<Comment>(c => c.user.posts); // => "user.posts"

オプション2: ヘルパー関数を定義する

自分で簡単に nameof を定義することができますが、文字列リテラルをタイプする必要があるため、自動的にリファクタリングされることはありません。

const nameof = <T>(name: keyof T) => name;

渡されたプロパティ名を返しますが、プロパティ名が型に存在しない場合はコンパイル時エラーが発生します。 T . このように使用します。

interface Person {
    firstName: string;
    lastName: string;
}

const personName1 = nameof<Person>("firstName"); // => "firstName"
const personName2 = nameof<Person>("noName");    // => compile time error

クレジットとこれに関する詳細情報

TypeScript 2.9+でのヘルパー関数の更新について

タイプ keyof T は文字列に解決されるだけでなく string | number | symbol ( ref ). それでも文字列のみを解決したい場合は、代わりにこの実装を使用してください。

const nameof = <T>(name: Extract<keyof T, string>): string => name;