funktion - Varför tillåter TypeScript standardparametrar före obligatoriska parametrar?
Jag märkte just att den här funktionen (som använder standardparametrar) inte orsakar fel vid kompilering.
function buildAddress(address1 = 'N/A', address2: string) {
displayAddress( address1 +' '+ address2);
}
men den här funktionen (som använder valfria parametrar) gör det.
function buildAddress(address1?: string, address2: string) {
displayAddress( address1 +' '+ address2);
}
varför är det så?
Jag är verkligen förvånad över detta beteende, är det normalt? Har det någon nytta? Är detta en funktion eller ett fel?
Svar #1
Har du försökt använda den första versionen utan att skicka det första argumentet?
function buildAddress(address1: string = 'N/A', address2: string) {
console.log(address1, address2);
}
buildAddress("address2");
Resulterar i:
De angivna parametrarna matchar ingen signatur för anropsmålet
Om du däremot sätter standardvärdet för den andra parametern:
function buildAddress(address1: string , address2: string = 'N/A') {
console.log(address1, address2);
}
Det fungerar.
Att lägga till ett standardvärde för den första parametern hjälper dig bara om du skickar undefined:
buildAddress(undefined, "address2");
När det kompileras till:
function buildAddress(address1, address2) {
if (address1 === void 0) { address1 = 'N/A'; }
console.log(address1, address2);
}
Så i verkligheten, om du gör detta, är den första parametern inte alls valfri, du måste skicka ett värde, och du får bara standardvärdet om du skickar undefined.
Men kompilatorn kommer inte att klaga på funktionssignaturen eftersom den första parametern säkert har ett värde, men i din andra funktion, eftersom den första parametern är valfri, klagar kompilatorn.
Redigera
Detta beteende kan användas för att skydda mot undefined-värden, till exempel:
function buildAddress(address1 = 'N/A', address2: string) {
displayAddress(address1 + ' ' + address2);
}
function getAddress1(): string {
// logic here, might return undefined
}
buildAddress(getAddress1(), "address 2");
Jag är inte säker på om detta är avsiktligt eller bara en bieffekt, men det är användbart i vissa fall.
