Dado el siguiente código
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
¿Por qué no se rechaza la inicialización? Después de todo, el segundo objeto no tiene la propiedad "apellido".
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Respuestas:
Editar : Esto se ha solucionado en las últimas versiones de TS. Citando el comentario de @ Simon_Weaver sobre la publicación del OP:
Aparentemente, esto no funciona al pasar los datos iniciales en la declaración. Supongo que esto es un error en TypeScript, por lo que debería plantear uno en el sitio del proyecto.
Puede utilizar el diccionario escrito dividiendo su ejemplo en declaración e inicialización, como:
fuente
id
símbolo? Parece que es innecesario.id
símbolo, puede declarar cuál debería ser el tipo de las claves del diccionario. Con la declaración anterior, no podría hacer lo siguiente:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
símbolo se puede nombrar como desee y se diseñó de esa manera para que sea más fácil leer el código. por ejemplo{ [username: string] : IPerson; }
Para usar el objeto de diccionario en mecanografiado, puede usar la interfaz de la siguiente manera:
y, use esto para su tipo de propiedad de clase.
para usar e inicializar esta clase,
fuente
Estoy de acuerdo con thomaux en que el error de comprobación del tipo de inicialización es un error de TypeScript. Sin embargo, todavía quería encontrar una manera de declarar e inicializar un Diccionario en una sola declaración con la verificación de tipo correcta. Esta implementación es más larga, sin embargo, agrega funcionalidades adicionales como un
containsKey(key: string)
yremove(key: string)
método. Sospecho que esto podría simplificarse una vez que los genéricos estén disponibles en la versión 0.9.Primero declaramos la clase de diccionario base y la interfaz. La interfaz es necesaria para el indexador porque las clases no pueden implementarlos.
Ahora declaramos el tipo específico de persona y la interfaz Diccionario / Diccionario. En la nota PersonDictionary, cómo anulamos
values()
ytoLookup()
devolvemos los tipos correctos.Y aquí hay un ejemplo simple de inicialización y uso:
fuente
containsKey(key: string): bool;
no funciona con TypeScript 1.5.0-beta . Debería cambiarse acontainsKey(key: string): boolean;
.Aquí hay una implementación de diccionario más general inspirada en esto de @dmck
fuente
Si desea ignorar una propiedad, márquela como opcional agregando un signo de interrogación:
fuente
Ahora, hay una biblioteca que proporciona colecciones fuertemente tipadas y consultables en mecanografiado.
Estas colecciones son:
La biblioteca se llama ts-generic-collections-linq .
Código fuente en GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
Con esta biblioteca, puede crear colecciones (como
List<T>
) y consultarlas como se muestra a continuación.fuente