No TS se queremos redefinir uma função algo como polimorfismo, onde temos o mesmo nome da função mas a sua assinatura é diferente. Ou seja, o número de parametros é diferente podemos simplesmente deixar o mesmo nome da função e mudarmos a quantidade de parametros:
function calculateTax(amount) {
return amount * 1.2;
}
function calculateTax(amount, discount) {
return calculateTax(amount) - discount;
}
let taxValue = calculateTax(100);
console.log(`Total Amount: ${taxValue}`);
O que disso que temos é que temos uma mesma função podendo ser executada de formas diferentes com base na
Assim temos que valores default tornam esse parametro optional, já que se não for definido ele usara o fallback
Using a rest parameter
A contra partida de parametros opcionais é o rest parameters, que permite uma função aceitar um número variavel de argumentos extras que são agrupados juntos e apresentados juntos
Para controlar para que não usar valores null ou undefined
function calculateTax(amount: number, discount: number = 0, ...extraFees: number[]) {
return (amount * 1.2) - discount
+ extraFees.reduce((total, val) => total + val, 0);
}
let taxValue = calculateTax(null, 0);
console.log(`Tax value: ${taxValue}`);
Understanding Function Results
O compilador do TS para os retornos tenta inferir o tipo automaticamente, com base no código
Se uma função retornar mais de um valor o compilador irá usar o type union para os tipos inferidos
Disabling implicit returns
Para desabilitarmos o retorno implicito e assim forçar para que todo retorno tenha seu type declarado devemos adicionar uma compiler option que vai fazer com que tenhamos isso:
Isso funciona para explicitarmos o tipo de retorno:
function calculateTax(amount: number, discount: number = 0,
...extraFees: number[]): number {
return (amount * 1.2) - discount
+ extraFees.reduce((total, val) => total + val, 0);
}
let taxValue = calculateTax(100, 0);
console.log(`Tax value: ${taxValue}`)
Defining void functions
Funções que não retornam nada são procedimentos e procedimentos tem o seu tipo como void
function calculateTax(amount: number, discount: number = 0,
...extraFees: number[]): number {
return (amount * 1.2) - discount
+ extraFees.reduce((total, val) => total + val, 0);
}
function writeValue(label: string, value: number): void {
console.log(`${label}: ${value}`);
}
writeValue("Tax value", calculateTax(100, 0))
Overloading Function Types
O type union pode fazer iso possivel para definir um range de types para parametros de funções e retornos, mas eles não permitem o relacionamento entre eles para ser expressado de forma certa:
function calculateTax(amount: number | null): number | null {
if (amount != null) {
return amount * 1.2;
}
return null;
}
function writeValue(label: string, value: number): void {
console.log(`${label}: ${value}`);
}
let taxAmount: number | null = calculateTax(100);
if (typeof taxAmount === "number") {
writeValue("Tax value", taxAmount);
}
Assim podemos fazer a sobrecarga de tipos com o TS, basta definir a função e tipar o que queremos:
function calculateTax(amount: number): number;
function calculateTax(amount: null): null;
function calculateTax(amount: number | null): number | null {
if (amount != null) {
return amount * 1.2;
}
return null;
}
function calculateTax(amount: number): number;
function calculateTax(amount: null): null;
function calculateTax(amount: number | null): number | null {
if (amount != null) {
return amount * 1.2;
}
return null;
}
function writeValue(label: string, value: number): void {
console.log(`${label}: ${value}`);
}
let taxAmount: number = calculateTax(100);
//if (typeof taxAmount === "number") {
writeValue("Tax value", taxAmount);
//}