J'utilise React et Redux et j'ai des types d'action spécifiés en tant qu'interfaces, afin que mes réducteurs puissent tirer parti des types d'union étiquetés pour une sécurité de type améliorée.
Donc, j'ai des déclarations de type qui ressemblent à ceci:
interface AddTodoAction {
type: "ADD_TODO",
text: string
};
interface DeleteTodoAction {
type: "DELETE_TODO",
id: number
}
type TodoAction = AddTodoAction | DeleteTodoAction
J'aimerais créer des fonctions d'assistance qui créent ces actions, et j'ai tendance à utiliser des fonctions fléchées pour cela. Si j'écris ceci:
export const addTodo1 = (text: string) => ({
type: "ADD_TODO",
text
});
Le compilateur ne peut pas fournir d'aide pour s'assurer qu'il s'agit d'un valide AddTodoActioncar le type de retour n'est pas spécifié explicitement. Je peux spécifier le type de retour explicitement en faisant ceci:
export const addTodo2: (text: string) => AddTodoAction = (text: string) => ({
type: "ADD_TODO",
text
})
Mais cela nécessite de spécifier deux fois mes arguments de fonction, donc c'est verbeux et plus difficile à lire.
Existe-t-il un moyen de spécifier explicitement le type de retour lors de l'utilisation de la notation fléchée?
J'ai pensé essayer ceci:
export const addTodo3 = (text: string) => <AddTodoAction>({
type: "ADD_TODO",
text
})
Dans ce cas, le compilateur déduit maintenant le type de retour comme AddTodoActionmais il ne valide pas que l'objet que je retourne a tous les champs appropriés.
Je pourrais résoudre cela en passant à une syntaxe de fonction différente:
export const addTodo4 = function(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
export function addTodo5(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
L'une ou l'autre de ces méthodes amènera le compilateur à utiliser le bon type de retour et imposera que j'ai défini tous les champs de manière appropriée, mais elles sont également plus verbeuses et changent la façon dont ` this` est géré dans une fonction (ce qui peut ne pas être un problème, Je suppose.)
Y a-t-il des conseils sur la meilleure façon de procéder?
getTitle = ():string => 'State Lists'