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)
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
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.
Depuis TypeScript 2.2, vous pouvez utiliser
let myVariable: object;
Edit: Voici un exemple:
let myVariable: object = { fun: 1 };
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
asBIZ_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 !