Skip to content

Instantly share code, notes, and snippets.

@geovanisouza92
Created December 13, 2017 11:35
Show Gist options
  • Save geovanisouza92/b5ad90dc475d7321dd774f6ed104b829 to your computer and use it in GitHub Desktop.
Save geovanisouza92/b5ad90dc475d7321dd774f6ed104b829 to your computer and use it in GitHub Desktop.
Análise de fluxo para evitar de "esquecer" de tratar código
// Aqui você define uma enumeração de valores: ela não é constante, vc define
// valores estruturais (não tipos) que são aceitos
type WillyWonkaElevatorDirection = "horizontal"
| "vertical"
// | "diagonal" // Descomente isso
;
// Aqui você pode usar esse novo tipo
function handleDirection(direction: WillyWonkaElevatorDirection) {
switch (direction) {
case "horizontal": return;
case "vertical": return;
// Caso um dos valores de direction não seja tratado, a análise
// de fluxo vai perceber que "assertNever" está sendo chamado
// com um valor do tipo ("diagonal" | never), e como a função
// "assertNever" só aceita "never", o TS vai avisar que você
// está "usando errado" a função
default: return assertNever(direction);
}
}
// Também funciona se você precisa aplicar o tipo em outras estrutura.
// Aqui o tipo é: um objeto onde a chave "k" é um valor de "WillyWonkaElevatorDirection"
// e o valor é uma string
const Handlers: {[k in WillyWonkaElevatorDirection]: string} = {
horizontal: "para o lado",
vertical: "para cima",
};
// Aqui você define uma função que estoura um erro caso seja chamada.
// O parâmetro genérico <T> é apenas para permitir que essa função seja
// usada em um return e o TypeScript "capture" o tipo de retorno
// automaticamente
function assertNever<T>(value: never): T {
throw new Error("assertNever called with value: " + value);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment