Dado o código a seguir
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Por que a inicialização não é rejeitada? Afinal, o segundo objeto não possui a propriedade "lastName".
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Respostas:
Editar : isso foi corrigido nas versões mais recentes do TS. Citando o comentário de @ Simon_Weaver no post do OP:
Aparentemente, isso não funciona ao passar os dados iniciais na declaração. Eu acho que isso é um bug no TypeScript, então você deve criar um no site do projeto.
Você pode usar o dicionário digitado dividindo seu exemplo em declaração e inicialização, como:
fonte
id
símbolo? Parece que é desnecessário.id
símbolo, você pode declarar qual deve ser o tipo das chaves do dicionário. Com a declaração acima, você não pode fazer o seguinte:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
símbolo pode ter o nome que você quiser e foi projetado dessa maneira para facilitar a leitura do código. por exemplo{ [username: string] : IPerson; }
Para usar o objeto de dicionário no texto datilografado, você pode usar a interface como abaixo:
e use isso para o seu tipo de propriedade de classe.
para usar e inicializar essa classe,
fonte
Concordo com o thomaux que o erro de verificação do tipo de inicialização é um bug do TypeScript. No entanto, eu ainda queria encontrar uma maneira de declarar e inicializar um Dicionário em uma única instrução com verificação de tipo correta. Essa implementação é mais longa, porém adiciona funcionalidades adicionais, como a
containsKey(key: string)
eremove(key: string)
method. Suspeito que isso possa ser simplificado quando os genéricos estiverem disponíveis na versão 0.9.Primeiro, declaramos a classe base Dictionary e a interface. A interface é necessária para o indexador porque as classes não podem implementá-las.
Agora declaramos o tipo específico de Pessoa e a interface Dicionário / Dicionário. No PersonDictionary, observe como substituímos
values()
etoLookup()
retornamos os tipos corretos.E aqui está um exemplo simples de inicialização e uso:
fonte
containsKey(key: string): bool;
não funciona com o TypeScript 1.5.0-beta . Deve ser alterado paracontainsKey(key: string): boolean;
.Aqui está uma implementação do dicionário mais geral inspirada por isso no @dmck
fonte
Se você deseja ignorar uma propriedade, marque-a como opcional, adicionando um ponto de interrogação:
fonte
Agora, há uma biblioteca que fornece coleções pesquisáveis e de tipo forte em texto datilografado.
Essas coleções são:
A biblioteca é chamada ts-generic-collections-linq .
Código fonte no GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
Com esta biblioteca, você pode criar coleções (como
List<T>
) e consultá-las, como mostrado abaixo.fonte