Any
Um tipo virtual que engloba todos os tipos e nenhum tipo ao mesmo tempo.
Tipo padrão
Any
é o tipo inferido e o tipo de retorno quando nenhum tipo é explicitamente anotado em um método. Por exemplo:
identity = _ -> _
é equivalente a:
identity = (_: Any): Any -> _
Usar Any
, seja implicitamente ou explicitamente, desabilita a verificação de tipos para um parâmetro. A anotação explícita pode ser útil em casos em que você deseja deixar claro que está dando flexibilidade ao tipo que é aceito.
Ser muito liberal com Any
pode tornar seu código menos previsível e mais difícil de manter. É geralmente recomendado ser mais específico com as anotações de tipo sempre que possível:
# Exemplo de uso de Any que pode levar a problemas
console <- fat.console
doubleIt = (arg: Any): Void -> console.log(arg * 2)
doubleIt(2) # imprime: '4'
doubleIt('a') # gera: Error: unsupported expression > Text <multiply> Number
Este exemplo mostra que, embora a anotação de tipo Any
permita flexibilidade no tipo do parâmetro, também pode resultar em comportamento inesperado se um argumento de um tipo inesperado for passado. Ao ser mais específico com a anotação de tipo, como Number
, você pode tornar seu código mais previsível e autoexplicativo.
# Exemplo de uso de uma anotação de tipo específica para maior previsibilidade
console <- fat.console
doubleIt = (num: Number): Void -> console.log(num * 2)
doubleIt(2) # imprime: '4'
doubleIt('a') # gera: TypeError: type mismatch > num
Ao usar Number
como a anotação de tipo, o método doubleIt
agora é mais específico e só aceita argumentos do tipo Number
.
Comparação
A única operação possível com Any
é a comparação com ele, mas note que Any
aceita todos os valores indistintamente, então não há uso prático para isso:
null == Any # verdadeiro
true == Any # verdadeiro
12345 == Any # verdadeiro
'abcd' == Any # verdadeiro
[ 1, 2 ] == Any # verdadeiro
{ a = 8 } == Any # verdadeiro
as comparações com
Any
não podem ser usadas para verificar a presença de um valor em um escopo, pois até mesmonull
é aceito