A equipe do TypeScript anunciou o lançamento da versão 3.5, que inclui melhorias de desempenho na verificação de tipos, além de um novo tipo Omit.
No TypeScript 3.4, havia sido adicionado o novo flag --incremental, permitindo salvar informações do grafo do projeto originadas da última compilação. Isso permite detectar a maneira mais rápida de verificar tipos e emitir alterações para um projeto, reduzindo tempos de compilação subsequentes. A versão 3.5 traz melhorias nessa abordagem, conforme explica o gerente de programa da equipe do TypeScript, Daniel Rosenwasser:
"O TypeScript 3.5 inclui otimizações na forma de armazenar em cache o estado do programa/ambiente que foi calculado - incluindio configurações do compilador e os motivos porque arquivos foram consultados, onde esses arquivos foram encontrados etc. Em cenários envolvendo centenas de projetos que usam referências de projeto do TypeScript no modo --build, descobrimos que o tempo de criação de novos builds pode ser reduzido em até 68%, se comparado ao TypeScript 3.4!"
Para acelerar o tempo de verificação de tipos em geral, e para resolver certos retrocessos de desempenho em type-checking trazidos na versão 3.4, a equipe do TypeScript concentrou-se em otimizar caminhos no código (code paths), tornando a nova versão mais rápida para muitas verificações incrementais de tipos - além de acelerar o processo de compilação, de autoconclusão de código e de outras operações de programação.
Em um padrão de codfificação típico em TypeScript, é criado um novo tipo que omite propriedades específicas de outro tipo. Antes do TypeScript 3.5, normalmente seria usada uma combinação dos helpers Pick e Exclude para definir um padrão de Omit (omissão). A versão 3.5, no entanto, adiciona um novo tipo Omit. Um exemplo disso, fornecido pela equipe da linguagem, mostra o processo de definição de um tipo Person sem a propriedade location antes e depois da versão 3.5.
No TypeScript 3.4, sem Omit:
type Person = {
name: string;
age: number;
location: string;
};
type RemainingKeys = Exclude<keyof Person, "location">;
type QuantumPerson = Pick<Person, RemainingKeys>;
// equivalent to
type QuantumPerson = {
name: string;
age: number;
};
No TypeScript 3.5, com Omit:
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
Pode-se aproveitar o novo Omit e outros tipos de helper predefinidos usando lib.d.ts.
O TypeScript suporta a verificação de propriedades em excesso/espúrias nos literais de objetos, detectando erros de digitação quando um tipo contém uma propriedade inesperada. Antes do TypeScript 3.5, algumas propriedades espúrias eram permitidas, como uma propriedade de nome em um objeto literal -- isso porque uma union não discriminada não faria a verificação de propriedades espúrias em seus membros. Na versão 3.5, o TypeScript verifica se todas as propriedades fornecidas pertencem a algum membro da union e ao tipo apropriado.
O TypeScript 3.5 melhora a verificação de tipos de união (union types). Ao verificar esses tipos, o TypeScript normalmente compara isoladamente cada tipo constituinte. Antes da versão 3.5, em alguns casos, a verificação de tipos falhava ao encontrar uma definição não suficientemente específica. Se um membro do tipo, por exemplo, permitisse um valor verdadeiro ou falso, e outro permitisse que a mesma propriedade fosse booleana, a verificação falharia. No TypeScript 3.5, agora os tipos são decompostos em uma união de todos os tipos possíveis. Como boolean é uma união de verdadeiro e falso, esse exemplo passaria pela verificação de tipos na versão 3.5.
O TypeScript 3.4 introduziu o suporte para funções inferirem os tipos a partir de outras funções genéricas. O TypeScript 3.5 generaliza essa funcionalidade, trazendo a inferência também para construtores. A nova inferência permite que funções que operam em componentes de classes, em algumas bibliotecas de front-end como o React, operem mais corretamente em componentes de classe genéricos.
Entre outros novos recursos incluídos no TypeScript 3.5 estão a flag --allowUmdGlobalAccess; a API Smart Select, que permite a editores expandir seleções de texto levando em conta a estrutura sintática do código; e uma refatoração para extrair tipos para aliases de tipos locais.
O TypeScript 3.5 introduz alterações que podem quebrar código em versões anteriores, todas consequências do uso das novas funcionalidades:
- Parâmetros genéricos de tipos são implicitamente restritos a unknown
- { [k: string]: unknown } não é mais um alvo de atribuição wildcard
- Correções em escritas inseguras em tipos de acesso indexados
- Object.keys rejeita primitivas no ES5
- O lib.d.ts inclui o helper do tipo Omit
A equipe do TypeScript já está trabalhando em funcionalidades para o TypeScript 3.6, incluindo melhorias para geradores e iteradores, suporte para campos de classe privados em ECMAScript e outras melhorias no compilador, na infraestrutura e no editor.
A comunidade TypeScript também está se preparando para o segundo evento do TSConf em 11 de outubro deste ano, que contará com um keynote do fundador do TypeScript, Anders Hejlsberg.
O TypeScript é um software de código aberto disponível sob a licença Apache 2. Contribuições e comentários são encorajados, no projeto do TypeScript no GitHub, e devem seguir as diretrizes de contribuição do TypeScript e o código de conduta open source da Microsoft.