Tôi đang sử dụng React và Redux và có các kiểu hành động được chỉ định làm giao diện, để các trình giảm bớt của tôi có thể tận dụng các kiểu liên minh được gắn thẻ để cải thiện độ an toàn của kiểu.
Vì vậy, tôi có các khai báo kiểu như sau:
interface AddTodoAction {
type: "ADD_TODO",
text: string
};
interface DeleteTodoAction {
type: "DELETE_TODO",
id: number
}
type TodoAction = AddTodoAction | DeleteTodoAction
Tôi muốn tạo các hàm trợ giúp tạo ra các hành động này và tôi có xu hướng sử dụng các hàm mũi tên cho việc này. Nếu tôi viết cái này:
export const addTodo1 = (text: string) => ({
type: "ADD_TODO",
text
});
Trình biên dịch không thể cung cấp bất kỳ trợ giúp nào trong việc đảm bảo đây là giá trị hợp lệ AddTodoActionvì kiểu trả về không được chỉ định rõ ràng. Tôi có thể chỉ định kiểu trả về một cách rõ ràng bằng cách thực hiện điều này:
export const addTodo2: (text: string) => AddTodoAction = (text: string) => ({
type: "ADD_TODO",
text
})
Nhưng điều này yêu cầu xác định các đối số hàm của tôi hai lần, vì vậy nó dài dòng và khó đọc hơn.
Có cách nào tôi có thể chỉ định kiểu trả về một cách rõ ràng khi sử dụng ký hiệu mũi tên không?
Tôi đã nghĩ đến việc thử điều này:
export const addTodo3 = (text: string) => <AddTodoAction>({
type: "ADD_TODO",
text
})
Trong trường hợp này, trình biên dịch bây giờ suy ra kiểu trả về AddTodoActionnhưng nó không xác thực rằng đối tượng tôi đang trả về có tất cả các trường thích hợp.
Tôi có thể giải quyết vấn đề này bằng cách chuyển sang một cú pháp hàm khác:
export const addTodo4 = function(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
export function addTodo5(text: string): AddTodoAction {
return {
type: "ADD_TODO",
text
}
}
Một trong hai phương pháp này sẽ khiến trình biên dịch sử dụng đúng kiểu trả về và thực thi rằng tôi đã đặt tất cả các trường một cách thích hợp, nhưng chúng cũng dài dòng hơn và chúng thay đổi cách ' this' được xử lý trong một hàm (có thể không phải là vấn đề, Tôi giả sử.)
Có lời khuyên nào về cách tốt nhất để làm điều này?
getTitle = ():string => 'State Lists'