TypeScriptには、変数に汎用オブジェクトタイプを割り当てる方法があります。これが「一般的なオブジェクトタイプ」の意味です
let myVariable: GenericObject = 1 // Should throw an error
= 'abc' // Should throw an error
= {} // OK
= {name: 'qwerty'} //OK
つまり、JavaScriptオブジェクトのみを変数に割り当てることができ、他のタイプのデータ(数値、文字列、ブール値)は許可されません。
確実なこと:
type GenericObject = { [key: string]: any };
let myVariable1: GenericObject = 1; // Type 'number' is not assignable to type '{ [key: string]: any; }'
let myVariable2: GenericObject = 'abc'; // Type 'string' is not assignable to type '{ [key: string]: any; }'
let myVariable3: GenericObject = {} // OK
let myVariable4: GenericObject = {name: 'qwerty'} //OK
( 遊び場のコード )
TypeScript 2.1+には ユーティリティタイプ 、Record<K, T>
、独自の定義を作成する代わりに使用できます
const myObj: Record<string, any>;
key
に意味のある名前を付けることができる場合は、トップアンサーで説明されているスタイルを使用するのが好きですが、それがそれほど明白ではない場合、または必要でない場合は、Record
が優れたオプションです。
TypeScript 2.2以降で使用できます
let myVariable: object;
編集:ここに例があります:
let myVariable: object = { fun: 1 };
ここで@JaredMcAteerから他の場所で同様の答えを見つけられなかったので、少し正接しました。record
を使用すると、列挙型+オブジェクトの混合に役立ちました。
enum FOO_ENUM {
BAR = 'BAZ';
}
type FOO_OBJECT_TYPE = { ... };
const BIZ_OBJECT: Record<FOO_ENUM, FOO_OBJECT_TYPE> = {
[FOO_ENUM.BAR]: { ... }
}
以前BIZ_OBJECT
と入力していた場所BIZ_OBJECT: {[type: string]: FOO_OBJECT}
これはBIZ_OBJECT.asd
のようなものを許可しましたが、現在はFOO_ENUM
からのキーのみを使用できます。
BIZ_OBJECT.BAZ // { ... }
BIZ_OBJECT.asd // Property 'asd' does not exist on type ...
BIZ_OBJECT[FOO_ENUM.BAR] // { ... }
BIZ_OBJECT[FOO_ENUM.asd] // Property 'asd' does not ...
BIZ_OBJECT[FOO_ENUM['asd']] // ! not caught !