Em contraste com outras respostas, há casos em que é aceitável retornar tipos diferentes.
Exemplo 1
sum(2, 3) → int
sum(2.1, 3.7) → float
Em algumas linguagens estaticamente tipadas, isso envolve sobrecargas, portanto podemos considerar que existem vários métodos, cada um retornando o tipo fixo predefinido. Em linguagens dinâmicas, esta pode ser a mesma função, implementada como:
var sum = function (a, b) {
return a + b;
};
Mesma função, diferentes tipos de valor de retorno.
Exemplo 2
Imagine que você receba uma resposta de um componente OpenID / OAuth. Alguns provedores OpenID / OAuth podem conter mais informações, como a idade da pessoa.
var user = authProvider.findCurrent();
// user is now:
// {
// provider: 'Facebook',
// name: {
// firstName: 'Hello',
// secondName: 'World',
// },
// email: '[email protected]',
// age: 27
// }
Outros teriam o mínimo, seria um endereço de e-mail ou o pseudônimo.
var user = authProvider.findCurrent();
// user is now:
// {
// provider: 'Google',
// email: '[email protected]'
// }
Mais uma vez, a mesma função, resultados diferentes.
Aqui, o benefício de retornar tipos diferentes é especialmente importante em um contexto em que você não se importa com tipos e interfaces, mas com os objetos que realmente contêm. Por exemplo, vamos imaginar um site com linguagem madura. Então o findCurrent()
pode ser usado assim:
var user = authProvider.findCurrent();
if (user.age || 0 >= 16) {
// The person can stand mature language.
allowShowingContent();
} else if (user.age) {
// OpenID/OAuth gave the age, but the person appears too young to see the content.
showParentalAdvisoryRequestedMessage();
} else {
// OpenID/OAuth won't tell the age of the person. Ask the user himself.
askForAge();
}
Refatorar isso em código, onde cada provedor terá sua própria função, que retornará um tipo fixo bem definido, não apenas degradaria a base de código e causaria a duplicação de código, como também não traria nenhum benefício. Pode-se acabar fazendo horrores como:
var age;
if (['Facebook', 'Yahoo', 'Blogger', 'LiveJournal'].contains(user.provider)) {
age = user.age;
}