Używam React i Redux i mam określone typy akcji jako interfejsy, dzięki czemu moje reduktory mogą korzystać z oznaczonych typów związków w celu zwiększenia bezpieczeństwa typów.
Mam więc deklaracje typów, które wyglądają następująco:
interface AddTodoAction {
type: "ADD_TODO",
text: string
};
interface DeleteTodoAction {
type: "DELETE_TODO",
id: number
}
type TodoAction = AddTodoAction | DeleteTodoAction
Chciałbym stworzyć funkcje pomocnicze, które tworzą te akcje i zwykle używam do tego funkcji strzałkowych. Jeśli napiszę to:
export const addTodo1 = (text: string) => ({
type: "ADD_TODO",
text
});
Kompilator nie może zapewnić żadnej pomocy w upewnieniu się, że jest to poprawne, AddTodoActionponieważ typ zwracany nie został jawnie określony. Mogę jawnie określić typ powrotu, wykonując następujące czynności:
export const addTodo2: (text: string) => AddTodoAction = (text: string) => ({
type: "ADD_TODO",
text
})
Ale wymaga to dwukrotnego określenia argumentów funkcji, więc jest to szczegółowe i trudniejsze do odczytania.
Czy istnieje sposób, w jaki mogę jawnie określić zwracany typ, używając notacji strzałkowej?
Myślałem o wypróbowaniu tego:
export const addTodo3 = (text: string) => <AddTodoAction>({
type: "ADD_TODO",
text
})
W tym przypadku kompilator wnioskuje teraz o zwracanym typie jako, AddTodoActionale nie sprawdza, czy zwracany obiekt ma wszystkie odpowiednie pola.
Mogę rozwiązać ten problem, przełączając się na inną składnię funkcji:
export const addTodo4 = function(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
export function addTodo5(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
Każda z tych metod spowoduje, że kompilator użyje poprawnego typu zwracanego wyniku i wymusi prawidłowe ustawienie wszystkich pól, ale są one również bardziej szczegółowe i zmieniają sposób obsługi „ this” w funkcji (co może nie stanowić problemu, Przypuszczam.)
Czy jest jakaś rada, jak to zrobić najlepiej?
getTitle = ():string => 'State Lists'