O documento descreve as principais novidades da versão 4.1 do TypeScript. Entre elas estão: template literal types que permitem modelar funções e APIs com conjuntos específicos de strings; mapeamento de chaves em tipos mapeados com uma nova cláusula "as"; e tipos condicionais que agora podem se referenciar a si mesmos de forma recursiva.
5. 5
Javascript
linguagem de código aberto que
se baseia em JavaScript,
adicionando definições de tipo
estático.
Type-checking
Todo código JavaScript válido
também é código TypeScript.
Você pode obter erros de
verificação de tipo.
Gradual
Você pode ter uma aplicação
com Javascript e Typescript
simultaneamente
7. 7
Template Literal Types
Template literal types nos permitem modelar funções e APIs que esperam um conjunto de strings específicas.
type World = "world";
type Greeting = `hello ${World}`;
8. 8
Agora é possível mapear objetos e especificar o type para cada key de um objeto.
TypeScript 4.1 permite que você mapeie novamente as chaves em tipos mapeados com uma nova cláusula as.
type Options = {
[K in "noImplicitAny" | "strictNullChecks" | "strictFunctionTypes"]?: boolean
};
// same as
// type Options = {
// noImplicitAny?: boolean,
// strictNullChecks?: boolean,
// strictFunctionTypes?: boolean
// };
Key Remapping in Mapped Types
9. 9
Conditional types agora pode referenciar imediatamente ele mesmos e com seus types, deixando mais fácil a
criar aliases recursivos.
Por exemplo, se você quiser escrever um type pegando os elementos de um array, você pode fazer o
seguinte:
type ElementType<T> = T extends ReadonlyArray<infer U> ? ElementType<U> : T;
Function deepFlatten<T extends readonly unknown[]>(x: T): ElementType<T>[] {
Throw “not implemented”;
}
//Todos esses retornarão o type number[]:
deepDlatten([1, 2, 3]);
deepDlatten([[1], [2, 3]]);
Recursive Conditional Types
10. 10
Nesse novo modo, todo acesso a um objeto (como foo.bar) ou acesso indexado (como foo ["bar"]) é
considerado potencialmente undefined.
Se precisar acessar essa propriedade, você terá que verificar primeiro a existência dela ou usar um operador
de asserção não nulo
// Verifica se a propriedade existe primeiro
if (opts.yadda) {
console.log(opts.yadda.toString());
}
// Basicamente esta dizendo: “Confia em mim, eu sei o que estou fazendo”
// quando se utiliza o operador “!”.
opts.yadda!.toString();
Checked Indexed Accesses
11. Breaking Changes
11
- Mudanças no lib.d.ts
- abstract nao pode mais ser marcado como async
- any/unknown São propagados em posições falsas
- resolve Parameters não são mais opcionais em Promises