Funktionen saknar en avslutande return-sats och returtypen inkluderar inte 'undefined'. i TypeScript
Jag studerar TS. Jag försöker göra en enkel kalkylator. Hur kan jag göra denna kalkylator utan switch-sats? Om if-sats används uppstår ett fel i returtypen.
type Command = 'add' | 'substract' | 'multiply' | 'divide' | 'remainder';
const calculate = function (command: Command, num1: number, num2: number): number {
if (command === 'add') return num1 + num2;
if (command === 'substract') return num1 - num2;
if (command === 'multiply') return num1 * num2;
if (command === 'divide') return num1 / num2;
if (command === 'remainder') return num1 % num2;
// switch (command) {
// case 'add':
// return num1 + num2;
// case 'substract':
// return num1 - num2;
// case 'multiply':
// return num1 * num2;
// case 'divide':
// return num1 / num2;
// case 'remainder':
// return num1 % num2;
// default:
// throw Error('unknown command');
// }
};
console.log(calculate('add', 1, 3)); // 4
console.log(calculate('substract', 3, 1)); // 2
console.log(calculate('multiply', 4, 2)); // 8
console.log(calculate('divide', 4, 2)); // 2
console.log(calculate('remainder', 5, 2)); // 1
TypeScript-lekplats
Svar #1
Typescript har ett typkontrollparadigm som type inference och här försöker det ta reda på vad som ska hända för returtypen om inga av dina villkor matchar. Du behöver hantera alla returtyper, en av dessa lösningar kan vara den nedan:
type Command = 'add' | 'substract' | 'multiply' | 'divide' | 'remainder';
const calculate = function (command: Command, num1: number, num2: number): number | void {
if (command === 'add') return num1 + num2;
if (command === 'substract') return num1 - num2;
if (command === 'multiply') return num1 * num2;
if (command === 'divide') return num1 / num2;
if (command === 'remainder') return num1 % num2;
// switch (command) {
// case 'add':
// return num1 + num2;
// case 'substract':
// return num1 - num2;
// case 'multiply':
// return num1 * num2;
// case 'divide':
// return num1 / num2;
// case 'remainder':
// return num1 % num2;
// default:
// throw Error('unknown command');
// }
};
console.log(calculate('add', 1, 3)); // 4
console.log(calculate('substract', 3, 1)); // 2
console.log(calculate('multiply', 4, 2)); // 8
console.log(calculate('divide', 4, 2)); // 2
console.log(calculate('remainder', 5, 2)); // 1
console.log(calculate("badcommand", 2, 4)) // this won't return any value just error or undefined
Om du försöker ändra funktionsimplementeringen på grund av felet kan du göra alla beräkningsfunktioner som:
type Calculation = (num1: number, num2: number) => number
const add: Calculation = (num1, num2) => {
return num1 + num2;
}
const substract: Calculation = (num1, num2) => {
return num1 - num2;
}
// Others
Svar #2
Om du ersätter if/else-kedjan med ett switch-uttryck, kommer Typescript korrekt att avgöra att slutet av funktionen är oåtkomligt, och därför behövs ingen return-sats; däremot, om du försöker sätta en return-sats i slutet, kommer du att få ett fel för "oåtkomlig kod".
Observera att det inte finns något behov av en default-sats här, även om du kan lägga till en om du vill ha mer säkerhet vid körning.
const calculate = function (command: Command, num1: number, num2: number): number {
switch(command) {
case 'add':
return num1 + num2;
case 'substract':
return num1 - num2;
case 'multiply':
return num1 * num2;
case 'divide':
return num1 / num2;
case 'remainder':
return num1 % num2;
}
};
Lekplatslänk
