Texto de tipo: tipo é qualquer string, exceto para algumas exceções
Existe uma maneira no texto datilografado de definir um tipo que aceita qualquer coisa, exceto algumas coisas?
Considere este trecho:
type BagGuys = 'Voldemort' | 'Hitler';
type EveryoneElse = Exclude<string, BagGuys>; // this resolves to just string
function sayHi(name: EveryoneElse) {
console.log(`Hi ${name}!`);
}
sayHi('Mark'); // Ok!
sayHi('Voldemort'); // Ok too, we'd like to have an error here
Eu, é claro, gostaria que o texto datilografado me impedisse de dizer oi para os bandidos.
Observação: entendo por Excludeque não funciona aqui, estou apenas usando para transmitir minha intenção
Respostas
Esta é uma solução possível (hackeada):
type BagGuys = 'Voldemort' | 'Hitler';
function sayHi<T extends string>(name: T extends BagGuys ? 'Good guys' : T) {
console.log(`Hi ${name}!`);
}
sayHi('Mark'); // Ok
sayHi('Voldemort'); // Argument of type '"Voldemort"' is not assignable to parameter of type '"Good guys"'.
Playground aqui .
Não é perfeito (e se um BadGuy fosse chamado de "Mocinhos"? 🤯). Mas acho que é o melhor que podemos conseguir até que os tipos negados sejam implementados. Sinta-se à vontade para votar a favor dessa RP :)
Nota: eu vim com isso inspirado por esta pergunta semelhante .
Nota 2 : por algum motivo, se eu digitar a função com em sayHi<T>vez de sayHi<T extends string>, isso não funciona. Acho que é uma pergunta para um dia diferente.