"Como Funcionam os Tipos any, never, unknown e void?"

Em lições anteriores, você aprendeu como trabalhar com tipos primitivos, tipos union e interfaces. Mas o TypeScript tem alguns tipos especiais dos quais você deve estar ciente. Vamos começar olhando para o tipo any. O tipo any é usado para representar qualquer tipo de valor.
let randomValue: any;

randomValue = 42;           

randomValue = "Hello";     
 
randomValue = true;        

randomValue = { name: "Alice" };
Com esse tipo, você precisa ter cuidado porque ele pode ser facilmente usado em excesso e mal utilizado. Você não quer digitar tudo com o tipo any apenas para silenciar as mensagens de erro do TypeScript. Isso anula o propósito de usar TypeScript e adicionar segurança de tipo desde o início. Um equivalente mais seguro ao tipo any seria o tipo unknown. unknown é semelhante a any mas com o tipo unknown, você precisa fazer uma verificação de tipo na variável antes de usá-la. Aqui está um exemplo:
function doubleValue(value: unknown) {
  if (typeof value === "number") {
    console.log(value * 2);
  } else if (typeof value === "string") {
    console.log(value + value);
  }
}

doubleValue(10);    
doubleValue("Hi "); 
doubleValue(true);
Neste exemplo, as verificações de tipo garantem que as operações sejam realizadas apenas em valores do tipo correto. Valores que não correspondem aos tipos esperados são ignorados. O próximo tipo que vamos analisar é o tipo never. Esse tipo representa algo que nunca acontecerá. Na maioria das situações, você não estará escrevendo anotações de tipo usando never. Em vez disso, você provavelmente verá o tipo never aparecer em mensagens de erro como esta:
function processValue(value: string | number) {
  if (typeof value === "string") {
    console.log("String value:", value.toUpperCase());
  } else if (typeof value === "number") {
    console.log("Number value:", value * 2);
  } else {
    console.log(value); 
  }
}
Dentro da cláusula else do exemplo acima, o value tem um tipo never. Isso ocorre porque o ramo else agora é impossível de alcançar e não resta nenhum tipo. Se você tentasse fazer uma chamada da função com um valor diferente de string ou number, ele mostraria um erro como este:
function processValue(value: string | number) {
  if (typeof value === "string") {
    console.log("String value:", value.toUpperCase());
  } else if (typeof value === "number") {
    console.log("Number value:", value * 2);
  } else {
    console.log(value); 
  }
}

// Argument of type 'boolean' is not assignable to parameter of type 'string | number'.
processValue(true);
O último tipo que vamos analisar é o tipo void. Quando você tem uma função que não retorna um valor, esse seria um tipo void. Aqui está um exemplo:
type Status = "loading" | "success" | "error";

type Handler = {
  status: Status;
  onChange: (newStatus: Status) => void; 
};
Neste exemplo, a propriedade onChange para o tipo Handler não retorna nada, por isso está sendo usado void.
Este módulo não possui perguntas. Marque como concluído.