Executando verificação de segurança...
6

O TypeScript 4.9 é enorme!

Introdução

Se não souber, TypeScript é uma linguagem que se baseia em JavaScript para programação segura de tipo (tipada). O TypeScript tornou-se muito famoso na indústria, e a Microsoft acaba de anunciar o TypeScript 4.9 na semana passada.

O que há de novo ?

O operador satisfies
O objectivo de satisfies operator é impor uma condição sobre uma variável, sem alterar o seu tipo.

Por exemplo, quer dizer que uma cor é um fio, ou uma cor RGB, que se pareceria com isto:

type RGB = [red: number, green: number, blue: number];
type Color = RGB | string;

const myColor: Color = 'blue';

Não sabemos se o myColor é uma string ou uma cor RGB. Portanto, não podemos fazer algo como myColor.toLowerCase() mesmo que seja uma string.

Mas agora, com o TS 4.9, o operador satisfeito torna isto possível:

type RGB = [red: number, green: number, blue: number];
type Color = RGB | string;

const myColor = 'blue' satisfies Color; // works
const myIncorrectColor = 420 satisfies Color; // error

myColor.toUpperCase(); // valid because myColor is a string

Auto-Accessors em Classes

O TS 4.9 suporta uma próxima funcionalidade do ECMAScript chamada auto-accessors. Os Auto-Accessors são declarados tal como as propriedades das classes, excepto que são declarados com a palavra-chave accessor.

class Person {
    accessor name: string;

    constructor(name: string) {
        this.name = name;
    }
}

Como é que se parece debaixo dos panos:

class Person {
    #__name: string;

    get name() {
        return this.#__name;
    }
    set name(value: string) {
        this.#__name = name;
    }

    constructor(name: string) {
        this.name = name;
    }
}

Verificações para Igualdade em NAN

NaN é um valor numérico especial que significa "Not a Number" (Não é um número). Nada é sempre igual a NaN.

TypeScript gere erros de digitação em comparações directas contra NaN, e irá sugerir a utilização de alguma variação de Number.isNaN em vez disso.

Comandos "Remove Unused Imports" e "Sort Imports"

No passado, o TypeScript suportava apenas dois comandos de editor para gerir as importações: "Organizar Importações" e "Ordenar Importações" no TS 4.3

TypeScript 4.9 acrescenta mais, e agora fornece "Remove Unused Imports". O TypeScript irá agora remover nomes e declarações de importação não utilizadas.

Estreitamento de propriedades não listadas com o in Operador

Como Developers, precisamos muitas vezes de lidar com valores que não são totalmente conhecidos em tempo de execução. De facto, muitas vezes não sabemos se existem propriedades, se estamos a receber uma resposta de um servidor ou a ler um ficheiro de configuração. JavaScript's in operador podem verificar se existe uma propriedade num objecto.

O TypeScript 4.9 torna o in operador um pouco mais poderoso ao estreitar os tipos que não listam de todo a propriedade. Em vez de os deixar tal como estão, a linguagem irá intersectar os seus tipos com Record<"property-key-being-checked", unknown>.

Conclusão

Este artigo é apenas um resumo das notas de correcção do TypeScript 4.9. Espero que consiga actualizar as informações mais recentes da sua stack.

Referencia: https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/

Carregando publicação patrocinada...
1

Não entendi muito bem qual é o propósito do satisfies. O que seria esse "error"? Seria um erro em tempo de compilação?

Isso significa dizer que quando eu coloco o satifies dispensa um if para verificar o tipo da variável?

2

Adaptando o exemplo da publicação, não ficou claro para mim também, porque é possível fazer isso no TypeScript 4.8.4:

type RGB = [red: number, green: number, blue: number];
type Color = RGB | string;

const myColor: Color = 'blue'; // ok
const myIncorrectColor: Color = 420; // erro

myColor.toUpperCase(); // ok

Playground

Mas lendo o issue sobre essa feature, descobri um cenário que parece fazer sentido. Por exemplo:

type Keys = 'a' | 'b' | 'c' | 'd';

const p = {
    a: 0,
    b: "hello",
    x: 8 // erro
} satisfies Partial<Record<Keys, unknown>>;

let a = p.a.toFixed(); // ok, a = number
let b = p.b.substr(1); // ok, b = string
let d = p.d; // erro

Playground

type Keys = 'a' | 'b' | 'c' | 'd';

const p: Partial<Record<Keys, unknown>> = {
    a: 0,
    b: "hello",
    x: 8 // erro
};

let a = p.a.toFixed(); // erro, mas deveria funcionar
let b = p.b.substr(1); // erro, mas deveria funcionar
let d = p.d; // funcionou, mas deveria dar erro

Playground

E tem uma discussão bem mais profunda na issue com vários exemplos.

1
0