Varför låter TypeScript mig lägga till en sträng och ett tal? Kan jag förhindra det?


Följande kod

let k = "1";
k += 1;
console.log(k);

kompileras korrekt med TypeScript, även i strikt läge. Jag skulle ha förväntat mig att tsc skulle misslyckas med något fel som Kan inte lägga till en sträng och ett heltal.. Varför byggs det framgångsrikt? Kan jag förhindra detta farliga beteende?

Svar #1

"'Det är giltigt eftersom det är giltigt i JS' är ett icke-svar i sammanhanget varför en viss operation inte är en typfel; se Vad betyder 'all legal JavaScript is legal TypeScript'?"

I JavaScript är kod som alert("Din plats i kön är " + queuePos) idiomatisk och vanlig -- den skrivs inte vanligtvis som "str" + num.toString().

TypeScripts ståndpunkt är att idiomatisk JS inte bör orsaka typfel (när det är praktiskt). Detta innebär att string + number är en tillåten typkonvertering.

Frågan om vad += ska göra är då en fråga om att välja mellan två alternativ:

  • konsekvens: x=x + y bör vara identisk med x += y
  • säkerhet: x += y görs inte vanligtvis mellan string och number-operander, så det borde vara en otillåten tvingning

Båda valen är förnuftiga och försvarbara; TypeScript råkade välja det första.

Svar #2

Du kan förhindra den här typen av olyckor med TypeScript-ESLint-regeln restrict-plus-operands:

När man lägger till två variabler måste båda operanderna vara av typen nummer eller av typen sträng.

Konfigurationsexempel:

"restrict-plus-operands": true

Om du aktiverar den regeln, kommer följande kod:

const x = 5;
const y = 'foo';
const z = x + y;
console.log(z);

kommer att resultera i:

FEL: .ts - Operander av '+'-operationen måste antingen vara båda strängar eller båda siffror, men hittade 5 + "foo". Överväg att använda mallsträngar.

Regeln hindrar inte bara användning av + mellan strängar och siffror, utan den hindrar också användning av += när typen på vänster sida är olika från typen på höger sida.

Relaterade artiklar