TypeScript bietet starke Garantien für viele Arten von ungültigen Eingaben.
Was es nicht tut, ist, geworfene Ausnahmen auf nützliche Weise durch Ihr Programm zu verfolgen.
Deshalb lesen sich erwartete Fehler oft klarer als Daten als als Ausnahmen.
Nicht jeder Fehler sollte eine Ausnahme auslösen
Es gibt einen Unterschied zwischen:
"das Zahlungsgateway hat card_declined zurückgegeben"
"unser Prozess hat eine Invariante verletzt, die niemals passieren sollte"
Das erste gehört zum normalen Geschäftsablauf.
Das zweite ist außergewöhnlich.
Wenn Sie in beiden Fällen eine Ausnahme auslösen, müssen die Aufrufer zu viel aus dem Kontrollfluss ableiten.
Ein einfacher Ergebnistyp
Sie benötigen keine Kategorientheorie, um die Idee gut zu nutzen. In TypeScript genügt eine diskriminierte Union:
type Result < T , E > =
| { ok : true ; value : T }
| { ok : false ; error : E };
async function fetchUser ( id : string ) : Promise < Result < User , " NOT_FOUND " | " NETWORK_ERROR " >> {
const response = await fetch ( ` /api/users/ ${ id }` ) ;
if ( response . status === 404 ) {
return { ok : false , error : " NOT_FOUND " };
}
if ( ! response . ok ) {
return { ok : false , error : " NETWORK_ERROR " };
}
return { ok : true , value : await response . json () };
}
Jetzt sagt die Funktionssignatur dem Aufrufer, dass ein Fehler erwartet und modelliert ist.
Was Sie gewinnen
Dieser Ansatz hilft, wenn:
die Fehlermodi Teil der Domänenlogik sind
vom Aufrufer erwartet wird, auf jeden einzelnen anders zu reagieren
Sie möchten, dass diese Fälle im Typsystem sichtbar sind
Der Aufrufort wird explizit:
const result = await fetchUser ( " 123 " ) ;
if ( ! result . ok ) {
if ( result . error === " NOT_FOUND " ) return render404 () ;
return renderRetryState () ;
}
return renderProfile ( result . value ) ;
Das ist oft einfacher zu überprüfen als ein try/catch, das Transportfehler, Parserfehler und Geschäftslogikfehler in einem Block mischt.
Was Sie dennoch auslösen sollten
Ergebnistypen sind kein Grund, Ausnahmen zu verbannen.
Werfen Sie eine Ausnahme, wenn:
der Prozess eine wahre Invarianzverletzung aufgedeckt hat
die Fortsetzung der Ausführung unsicher ist
eine Rahmenbedingung Ausnahmen erwartet
Modellieren Sie als Daten, wenn:
der Fehler erwartet wird
der Aufrufer darauf basierend verzweigen muss
es Teil des normalen Produktverhaltens ist
Diese Linie ist nützlicher als die pauschale Regel "Ausnahmen sind schlecht".
Weiterführende Informationen