web-dev-qa-db-fra.com

Type d'objet générique en tapuscrit

Dans TypeScript, existe-t-il un moyen d'affecter à une variable un type d'objet générique. Voici ce que je veux dire par "type d'objet générique"

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

c'est-à-dire qu'il ne doit autoriser que les objets javascript à être affectés à la variable et aucun autre type de données (nombre, chaîne, booléen)

16
Nahush Farkande

Chose sûre:

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

( code dans l'aire de jeux )

34
Nitzan Tomer

TypeScript 2.1+ a également un type utilitaire , Record<K, T>, vous pouvez utiliser au lieu de créer votre propre définition

const myObj: Record<string, any>;

J'aime utiliser le style décrit dans la première réponse lorsque je peux donner un nom significatif à key mais si ce n'est pas vraiment aussi évident ou nécessaire Record est une excellente option.

1
JaredMcAteer

Depuis TypeScript 2.2, vous pouvez utiliser

let myVariable: object;

Edit: Voici un exemple:

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

Un peu tangente puisque je n'ai pas trouvé de réponse similaire ailleurs, de @JaredMcAteer ici, en utilisant record m'a aidé à mélanger des énumérations + des objets.

enum FOO_ENUM {
  BAR = 'BAZ';
}

type FOO_OBJECT_TYPE = { ... };

const BIZ_OBJECT: Record<FOO_ENUM, FOO_OBJECT_TYPE> = {
  [FOO_ENUM.BAR]: { ... }
}

Où avant je tapais BIZ_OBJECT as
BIZ_OBJECT: {[type: string]: FOO_OBJECT}
qui a permis quelque chose comme BIZ_OBJECT.asd, maintenant seulement une clé de FOO_ENUM peut être utilisé, par ex.

  • 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