O que há de novo no TypeScript 2.7
A Microsoft anunciou recentemente as novas features disponíveis na versão 2.7 do TypeScript. Irei destacar, neste artigo, as mais impactantes que se encontram disponíveis para uso. Mas primeiro...
Instalação
Caso você ainda não tenha o TypeScript instalado, você pode instalá-lo através do NPM
e deixar disponível de forma global com a flag -g
.
Para instalar a última versão estável:
$ npm install -g typescript
E se preferir instalar a última versão em desenvolvimento
:
$ npm install -g typescript@next
Verifique se tudo foi instalado utilizando o comando tsc -v
:
Feito isso, agora é hora de nos aventurarmos nas novas features. Vamos conhecê-las...
Strict Class Initialization
A versão 2.7 do TypeScript
introduziu uma nova flag chamada --strictPropertyInitialization
. Esta flag executa verificações para garantir que cada atributo de instância de uma classe seja inicializado no corpo do construtor ou por um inicializador de atributo.
class Team { wins: number; name = "teamNameDefault"; status: boolean; // ~~~ // Error! Property 'status' has no initializer and is not definitely assigned in the constructor. constructor() { this.wins = 18; } }
No exemplo acima, se nós quiséssemos que realmente a variável status
fosse indefinida (undefined
), deveríamos ter declarado da seguinte maneira: class Team { // ... status: boolean | undefined; // ... }
Existem certos cenários em que os atributos podem ser inicializados indiretamente (talvez por um método auxiliar ou biblioteca de injeção de dependência), e também casos em que podemos usar os novos modificadores de asserção de atribuição (assignment assertion modifiers) para seus atributos. Veja o exemplo abaixo: class Team { win!: number; // ^ // Notice this '!' modifier. // This is the "definite assignment assertion" constructor() { this.initialize(); } initialize() { this.win = 0; } }
Tenha em mente que --strictPropertyInitialization
será ativado juntamente com outras --strict
flags, que podem afetar seu projeto. Você pode definir a configuração strictPropertyInitialization
como false
no arquivo tsconfig.json
ou executando --strictPropertyInitialization false
na linha de comando para desativar esta verificação. Definite Assignment Assertions A asserção definitiva de atribuição é uma característica que permite que um !
(ponto de exclamação) seja adicionado após o atributo da instância e após as declarações de variáveis para transmitir ao TypeScript a ideia de que uma variável é realmente designada para todos os efeitos, mesmo que as análises do TypeScript não possam ser detectadas. Vejamos o exemplo: let a: number; initialize(); console.log(a + a); // ~ ~ // Error! Variable 'a' is used before being assigned. function initialize() { a = 10; }
Com asserções de atribuição definitivas, podemos afirmar que a váriável let a
é realmente atribuída adicionando um !
à sua declaração: // Notice the '!' let a!: number; initialize(); // No error! console.log(a + a); function initialize() { a = 10; }
Em certo sentido, o operador de asserção de atribuição definitiva é o dual do operador de afirmação não-nulo (no qual as expressões são posteriores à fixação com a !
), que também poderíamos ter usado de tal forma: let a: number; initialize(); // No error! console.log(a! + a!); function initialize() { a = 10; }
No nosso exemplo, sabíamos que todos os usos de a
seriam inicializados. Por isso, faz mais sentido usar asserções de atribuição definitiva do que afirmações não nulas. Qual é o próximo passo? Uma lista mais abrangente desta versão, bem como os planos futuros do TypeScript, podem ser encontrados no Roadmap do repositório. Para quem quiser saber mais sobre o TypeScript, a Loiane Groner fez uma palestra incrível na última edição da BrazilJS Conf. Confere lá: TypeScript: The fun parts - BrazilJS Conf 2017 Como de costume, a Microsoft incentiva a todos a se sentirem à vontade para contribuir com o projeto no repositório do GitHub. Sendo assim, se você encontrar algum problema, ajude para que outros desenvolvedores saibam. E não deixe de demonstrar como você se sente sobre este RC nos comentários abaixo! Referências Announcing TypeScript 2.7 RC TypeScript 2.7