我正在使用React和Redux,并将操作类型指定为接口,以便我的减量器可以利用标记的联合类型来提高类型安全性。
我有这样的类型声明:
interface AddTodoAction {
type: "ADD_TODO",
text: string
};
interface DeleteTodoAction {
type: "DELETE_TODO",
id: number
}
type TodoAction = AddTodoAction | DeleteTodoAction
我想创建辅助函数来创建这些动作,我倾向于使用箭头函数。如果我这样写:
export const addTodo1 = (text: string) => ({
type: "ADD_TODO",
text
});
编译器不能提供任何帮助来确保这是一个有效的AddTodoAction,因为没有显式地指定返回类型。我可以通过这样做显式地指定返回类型:
export const addTodo2: (text: string) => AddTodoAction = (text: string) => ({
type: "ADD_TODO",
text
})
但这需要两次指定函数参数,因此冗长且难以阅读。
是否有一种方法,我可以明确指定返回类型时,使用箭头符号?
我想试试这个:
export const addTodo3 = (text: string) => <AddTodoAction>({
type: "ADD_TODO",
text
})
在这种情况下,编译器现在推断返回类型为AddTodoAction,但它不验证我返回的对象是否具有所有适当的字段。
我可以通过切换到不同的函数语法来解决这个问题:
export const addTodo4 = function(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
export function addTodo5(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
这些方法中的任何一种都会导致编译器使用正确的返回类型,并强制我已经适当地设置了所有字段,但它们也更冗长,并且它们改变了'this'在函数中的处理方式(这可能不是一个问题,我想)。
有什么最好的建议吗?