Zuweisen (oder zu bestätigen) never
am Ende einer Funktion ist eine Technik, die in Typescript verwandt wird, um erschöpfende Überprüfungen bei Kompilierungszeit zu erzwingen.Vollständigkeitsprüfungen ohne explizite Zeichenfolgen
Damit der Compiler dies erkennt, müssen jedoch explizite Zeichenfolgen überprüft werden, um festzustellen, ob die Funktion vor der Zuweisung/Assertion von never
definitiv zurückgibt.
Wäre es möglich, eine Art typisierte Variation von Object.freeze einzuführen, die nur für Objektliterale und weiter oben in der Kette funktioniert, so dass etwas wie das Folgende getan werden könnte?
Noch besser, gibt es eine Möglichkeit, eine Schnittstelle zu schaffen, in der die Schlüssel automatisch die von jeder von Action.type (in diesem Beispiel) sind? Wenn das der Fall wäre - actionMap
könnte einfach als diese Schnittstelle deklariert werden, was die Prüfung bei compiletime erzwingen würde.
Beide sind Lösungen für das gleiche Problem ... nur eine diskriminierte Union gegeben, ist es möglich, Vollständigkeitsüberprüfungen wie diese bei compiletime durchzuführen, ohne explizite Strings in der Funktion verwenden zu müssen?
interface Increment {
type: 'increment'
}
interface Decrement {
type: 'decrement'
}
type Action = Increment | Decrement
const inc: Increment = { type: 'increment' };
const dec: Decrement = { type: 'decrement' };
//this would be a typescript variation
const actionMap = Object.freeze({
[inc.type]: n => n + 1,
[dec.type]: n => n-1
});
function doAction(action: Action, val: number): number {
if(actionMap[action.type]) {
return actionMap[action.type](val);
}
//this would error at compile time if the above checked failed
const _exhaustiveCheck: never = action;
}
console.log(doAction(inc, 1));
console.log(doAction(dec, 1));
Nur um klar zu sein. Sie möchten überprüfen, dass actionMap einen Wert für alle "type" -Werte in der diskriminierten Union "Action" hat. Ist das richtig? –
ja! Stimmt :) – davidkomer