generics - Typescript - Gör så att funktionens returtyp blir den klass som ett gränssnitt implementerar
Jag har följande kod:
export enum Side {
Left = 'left',
Right = 'right'
}
export interface Crosser {
side: Side
}
export const crossersOnCorrectSide = function(crossers: Crosser[], correctSide: Side): Crosser|undefined {
return crossers.find(crosser => { return crosser.side !== correctSide } )
}
Problemet är - jag vill inte att returtypen ska vara Crosser|undefined, utan jag skulle vilja att returtypen är typen av klassen som implementerar Crosser eller undefined.
Jag försökte använda generics och utföra en typförsäkran:
export const crossersOnCorrectSide = function<T>(crossers: Crosser[], correctSide: Side): T|undefined {
let result = crossers.find(crosser => { return crosser.side !== correctSide } )
if(result !== undefined) {
return result as T
}
return result
//return crossers.find(crosser => { return crosser.side !== correctSide } )
}
men jag fick "Typ Crosser kan inte konverteras till typ T".
Finns det något "korrekt" sätt att göra detta på, eller kommer jag att tvingas använda ts-ignore, eller ännu värre, är detta dålig design och borde jag bara utföra typomvandlingen efter att ha mottagit resultatet från crossersOnCorrectSide?
Svar #1
Eftersom uppringaren redan använder den implementerande typen, kan du helt enkelt använda den typen direkt:
export const crossersOnCorrectSide = function <T extends Crosser>(crossers: T[], correctSide: Side): T | undefined {
let result = crossers.find(crosser => { return crosser.side !== correctSide } )
if(result !== undefined) {
return result
}
else return undefined
}
Det är vanligt att använda generiska typer för att säkerställa rätt returtyp utan att anroparen behöver utföra en typomvandling. Du måste dock fortfarande veta vilken typ som är korrekt att använda för T när du anropar funktionen. Det är inte meningsfullt för din funktion att försöka upptäcka den faktiska underliggande klassen.
