web-dev-qa-db-ja.com

typescriptの汎用オブジェクトタイプ

TypeScriptには、変数に汎用オブジェクトタイプを割り当てる方法があります。これが「一般的なオブジェクトタイプ」の意味です

let myVariable: GenericObject = 1 // Should throw an error
                              = 'abc' // Should throw an error
                              = {} // OK
                              = {name: 'qwerty'} //OK

つまり、JavaScriptオブジェクトのみを変数に割り当てることができ、他のタイプのデータ(数値、文字列、ブール値)は許可されません。

16
Nahush Farkande

確実なこと:

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

遊び場のコード

34
Nitzan Tomer

TypeScript 2.1+には ユーティリティタイプRecord<K, T>、独自の定義を作成する代わりに使用できます

const myObj: Record<string, any>;

keyに意味のある名前を付けることができる場合は、トップアンサーで説明されているスタイルを使用するのが好きですが、それがそれほど明白ではない場合、または必要でない場合は、Recordが優れたオプションです。

1
JaredMcAteer

TypeScript 2.2以降で使用できます

let myVariable: object;

編集:ここに例があります:

let myVariable: object = { fun: 1 };
0
Bill Barnes

ここで@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 !
0
Josh Leslie