Ich verwende React und Redux und habe Aktionstypen als Schnittstellen angegeben, damit meine Reduzierer markierte Vereinigungstypen für eine verbesserte Typensicherheit nutzen können.
Ich habe also Typdeklarationen, die so aussehen:
interface AddTodoAction {
type: "ADD_TODO",
text: string
};
interface DeleteTodoAction {
type: "DELETE_TODO",
id: number
}
type TodoAction = AddTodoAction | DeleteTodoAction
Ich möchte Hilfsfunktionen erstellen, die diese Aktionen erstellen, und ich neige dazu, dafür Pfeilfunktionen zu verwenden. Wenn ich das schreibe:
export const addTodo1 = (text: string) => ({
type: "ADD_TODO",
text
});
Der Compiler kann keine Hilfe bereitstellen, um sicherzustellen, dass dies gültig ist, AddTodoActionda der Rückgabetyp nicht explizit angegeben wird. Ich kann den Rückgabetyp explizit angeben, indem ich dies tue:
export const addTodo2: (text: string) => AddTodoAction = (text: string) => ({
type: "ADD_TODO",
text
})
Dafür müssen meine Funktionsargumente jedoch zweimal angegeben werden, damit sie ausführlich und schwerer zu lesen sind.
Gibt es eine Möglichkeit, den Rückgabetyp bei Verwendung der Pfeilnotation explizit anzugeben?
Ich habe darüber nachgedacht, dies zu versuchen:
export const addTodo3 = (text: string) => <AddTodoAction>({
type: "ADD_TODO",
text
})
In diesem Fall AddTodoActionleitet der Compiler jetzt den Rückgabetyp als ab , überprüft jedoch nicht, ob das von mir zurückgegebene Objekt alle entsprechenden Felder enthält.
Ich könnte dies lösen, indem ich zu einer anderen Funktionssyntax wechsle:
export const addTodo4 = function(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
export function addTodo5(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
Jede dieser Methoden veranlasst den Compiler, den richtigen Rückgabetyp zu verwenden und zu erzwingen, dass ich alle Felder entsprechend festgelegt habe. Sie sind jedoch auch ausführlicher und ändern die Art und Weise, wie ' this' in einer Funktion behandelt wird (was möglicherweise kein Problem darstellt). Ich nehme an.)
Gibt es Ratschläge, wie dies am besten funktioniert?
getTitle = ():string => 'State Lists'