Déclarer et initialiser un Dictionnaire en caractères d'imprimerie
Donné le code suivant
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Pourquoi n'est-ce pas l'initialisation rejeté? Après tout, le deuxième objet n'ont pas le "nom" de la propriété.
- Remarque: cela a depuis été corrigé (pas sûr de l'exacte TS version). J'obtiens ces erreurs dans VS, comme vous le souhaitez:
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Vous devez vous connecter pour publier un commentaire.
Modifier: Cela a depuis été corrigé dans la dernière TS versions. Citant @Simon_Weaver commentaire sur l'OP du post:
Apparemment, cela ne fonctionne pas lors du passage de l'ensemble des données initiales lors de la déclaration.
Je suppose que c'est un bug dans la Machine, de sorte que vous devriez faire de l'un sur le site du projet.
Vous pouvez faire usage de l'tapé dictionnaire en divisant votre exemple dans la déclaration et l'initialisation, comme:
id
symbole? Il semble qu'il n'est pas nécessaire.id
symbole, vous pouvez déclarer ce que le type des clés du dictionnaire. Avec la déclaration ci-dessus, vous ne pouvez pas effectuer les opérations suivantes:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
symbole peut être n'importe quel nom que vous voulez et a été conçu pour faciliter la lecture du code. par exemple,{ [username: string] : IPerson; }
Je suis d'accord avec thomaux que l'initialisation de la vérification du type d'erreur est un Tapuscrit de bug. Cependant, je voulais trouver une façon de déclarer et initialiser un Dictionnaire dans un rapport simple avec le bon type de vérification. Cette mise en œuvre est plus longue, toutefois, il ajoute des fonctionnalités supplémentaires comme un
containsKey(key: string)
etremove(key: string)
méthode. Je soupçonne que cela pourrait être simplifiée, une fois les médicaments génériques sont disponibles dans la version 0.9.Nous avons d'abord déclarer la base du Dictionnaire de classe et d'Interface. L'interface est nécessaire pour l'indexeur car les classes ne peuvent pas les mettre en œuvre.
Maintenant nous déclarer la Personne de type spécifique et Dictionnaire/Dictionnaire d'interface. Dans le PersonDictionary notez comment nous remplacer
values()
ettoLookup()
pour retourner les types appropriés.Et ici est une simple initialisation et exemple d'utilisation:
containsKey(key: string): bool;
ne fonctionne pas avec texte dactylographié 1.5.0-beta. Il devrait être remplacé parcontainsKey(key: string): boolean;
.Pour l'utilisation du dictionnaire de l'objet dans la machine, vous pouvez utiliser l'interface comme ci-dessous:
et les utiliser pour votre classe type de propriété.
à utiliser et initialiser cette classe,
Si vous souhaitez ignorer une propriété, le marquer comme option en ajoutant un point d'interrogation:
Ici est un plus générale dans le Dictionnaire de la mise en œuvre inspirée par la présente de @dmck
Maintenant, il y a une bibliothèque qui fournit fortement typées, queryable collections en caractères d'imprimerie.
Les collections sont:
La bibliothèque est appelée ts-générique-collections.
Le code Source sur GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
Avec cette bibliothèque, vous pouvez créer des collections (comme
List<T>
) et de les interroger comme indiqué ci-dessous.