Vamos imaginar que eu tenha uma função. É uma função muito boa, muito amigável. E ela recebe um argumento, vamos chamá-la de type
. Mas adivinhe? Na verdade, é uma string! Deixe-me dar um exemplo:
function returnWithType(o: any, type: 'string' | 'number') {
if (typeof o === type) return o
throw new Error(`AHHHH!!!!!`)
}
Viu o que eu fiz? Comparei o tipo com o tipo!
Mas, ok, agora deixe-me perguntar isto... como posso especificar o tipo de retorno real da função , de modo que se eles passarem "string"
, o tipo de retorno seja string
, e o mesmo para number , mas "number"
em vez de "string"
assumir que eles passaram o valor da string "number"
para o segundo parâmetro neste caso???
Eu basicamente quero isso:
function returnWithType(o: any, type: 'string' | 'number'):
asserts typeof o === as // <---- THIS
{
// ...
}
Ou talvez isto:
function returnWithType(...):
type extends 'string' ? string :
type extends 'number' ? number :
boolean
{
// ... solves world hunger ...
}
Acabei de perceber que posso fazer isso criando o genérico T extends ...
e retornando um ternário baseado em T, mas existe alguma maneira mais limpa , talvez com alguns builtins inteligentes, de derivar essas informações automaticamente???