Étant donné le code suivant
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Pourquoi l'initialisation n'est-elle pas rejetée? Après tout, le deuxième objet n'a pas la propriété "lastName".
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Réponses:
Edit : Cela a depuis été corrigé dans les dernières versions TS. Citant le commentaire de @ Simon_Weaver sur le post du PO:
Apparemment, cela ne fonctionne pas lors du passage des données initiales lors de la déclaration. Je suppose que c'est un bogue dans TypeScript, vous devriez donc en soulever un sur le site du projet.
Vous pouvez utiliser le dictionnaire tapé en divisant votre exemple en déclaration et initialisation, comme:
la source
id
symbole? Il semble que ce ne soit pas nécessaire.id
symbole, vous pouvez déclarer quel doit être le type des touches du dictionnaire. Avec la déclaration ci-dessus, vous ne pouvez pas faire ce qui suit:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
symbole peut être nommé comme vous voulez et a été conçu de cette façon pour faciliter la lecture du code. par exemple{ [username: string] : IPerson; }
Pour utiliser un objet dictionnaire dans un script, vous pouvez utiliser l'interface comme ci-dessous:
et utilisez-le pour votre type de propriété de classe.
d'utiliser et d'initialiser cette classe,
la source
Je suis d'accord avec thomaux que l'erreur de vérification du type d'initialisation est un bogue TypeScript. Cependant, je voulais toujours trouver un moyen de déclarer et d'initialiser un dictionnaire dans une seule instruction avec une vérification de type correcte. Cette implémentation est plus longue, mais elle ajoute des fonctionnalités supplémentaires telles que a
containsKey(key: string)
et laremove(key: string)
méthode. Je soupçonne que cela pourrait être simplifié une fois que les génériques seront disponibles dans la version 0.9.Nous déclarons d'abord la classe et l'interface de base du dictionnaire. L'interface est requise pour l'indexeur car les classes ne peuvent pas les implémenter.
Nous déclarons maintenant le type spécifique à la personne et l'interface Dictionnaire / Dictionnaire. Dans la note PersonDictionary comment nous remplaçons
values()
ettoLookup()
de retourner les bons types.Et voici un simple exemple d'initialisation et d'utilisation:
la source
containsKey(key: string): bool;
ne fonctionne pas avec TypeScript 1.5.0-beta . Il doit être remplacé parcontainsKey(key: string): boolean;
.Voici une implémentation du dictionnaire plus générale inspirée de celle de @dmck
la source
Si vous souhaitez ignorer une propriété, marquez-la comme facultative en ajoutant un point d'interrogation:
la source
Maintenant, il existe une bibliothèque qui fournit des collections fortement typées et interrogeables en dactylographie.
Ces collections sont:
La bibliothèque s'appelle ts-generic-collections-linq .
Code source sur GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
Avec cette bibliothèque, vous pouvez créer des collections (comme
List<T>
) et les interroger comme indiqué ci-dessous.la source