Omskriva funktion i TypeScript
Jag har följande (funktion som fungerar) i JavaScript:
function solve(strArr) {
return strArr.reduce(function ([x, y], curr) {
switch (curr) {
case 'up': return [x, y + 1]
case 'down': return [x, y - 1]
case 'left': return [x - 1, y]
case 'right': return [x + 1, y]
}
}, [0, 0])
}
Jag försöker skriva om det med TypeScript som:
function solve(strArr: string[]): number[] {
return strArr.reduce(([x, y]: number[], curr: string) => {
switch (curr) {
case 'up': return [x, y + 1]
case 'down': return [x, y - 1]
case 'left': return [x - 1, y]
case 'right': return [x + 1, y]
}
}, [0,0])
}
men jag får Type 'string' is not assignable to type 'number[]'.-felet, vilket jag vet refererar till ackumulatorn, men vet inte hur jag ska lösa det.
Enligt Rajeshs förslag löser det problemet att ändra typen på strArr till any, men att ge det den specifika typ jag använder med funktionen fungerar inte; varför?
Svar #1
Du kan lägga till ett standardfall för din switch som andra har föreslagit.
Jag skulle rekommendera en andra lösning, vilket är att skapa en typ för din inparametern för att begränsa typen:
type Direction = 'up' | 'down' | 'left' | 'right'
function solve(strArr: Direction[]) {
return strArr.reduce(([x, y], curr) => {
switch (curr) {
case 'up': return [x, y + 1]
case 'down': return [x, y - 1]
case 'left': return [x - 1, y]
case 'right': return [x + 1, y]
}
}, [0,0])
}
Spela
Svar #2
Du bör uttryckligen hantera standardfallet i din switch:
function solve(strArr:string[]) {
return strArr.reduce(([x, y], curr) => {
switch (curr) {
case 'up': return [x, y + 1]
case 'down': return [x, y - 1]
case 'left': return [x - 1, y]
case 'right': return [x + 1, y]
// maybe throw an error instead
default: return [x, y];
}
}, [0,0])
}
Lekplats exempel
utan standardfallet returnerar din reduceringsfunktion typen: number[] | undefined
