Assertion Functions
Dada a flexibilidade do JavaScript, pode ser uma boa ideia
adicionar verificações em tempo de execução ao seu código
para validar suas suposições.
Normalmente são chamadas de asserções (ou invariantes) e
são pequenas funções que geram erros no início, quando
suas variáveis não correspondem ao que você espera.
O Node vem com uma função pronta para fazer isso,
é chamada de assert e está disponível sem importação.
No entanto, vamos definir a nossa própria. Isso declara
uma função que afirma que a expressão chamada value é
verdadeira:
// Com o TypeScript 3.7, a análise do fluxo de código pode
usar esses tipos de funções para descobrir o que é o
código. Então, quando você passa o mouse sobre a
variável abaixo - você pode ver que ela foi reduzida
de uma string ou número para apenas uma string.
declare function assert(value: unknown): asserts value;
// Agora vamos usá-la para validar o tipo de enum
declare const maybeStringOrNumber: string | number;
assert(typeof maybeStringOrNumber === "string");
// Você pode usar funções assert para garantir seus
tipos em todo o código inferido, por exemplo, o
TypeScript sabe que essa função retornará um número
sem a necessidade de adicionar tipos ao parâmetro por
meio da declaração de assert acima.
maybeStringOrNumber;
// As funções de asserção são irmãs das Type Guards
example:type-guards com exceção de afetar o fluxo de
controle quando ele continua através da função.
Por exemplo, podemos usar funções de asserção para
restringir um enum ao longo do tempo:
function multiply(x: any, y: any) {
assert(typeof x === "number");
assert(typeof y === "number");
return x * y;
}
// Esta é uma introdução sobre alguns dos recursos das
funções de asserção no TypeScript 3.7 - você pode
descobrir mais lendo as notas de lançamento:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
declare const oneOfFirstFiveNumbers: 1 | 2 | 3 | 4 | 5;
declare function isOdd(param: unknown): asserts param is 1 | 3 | 5;
declare function isBelowFour(param: unknown): asserts param is 1 | 2 | 3 | 4;
// Isso deve reduzir o enum para: 1 | 3 | 5
isOdd(oneOfFirstFiveNumbers);
oneOfFirstFiveNumbers;
// Isso cortará os possíveis estados do enum para: 1 | 3
isBelowFour(oneOfFirstFiveNumbers);
oneOfFirstFiveNumbers;