Quiero crear algo similar a createAction de redux-toolkit. Necesito pasar un tipo de carga útil a createAction, pero no entiendo cómo hacer que una propiedad opcional sea obligatoria si se pasa.
Aquí está mi implementación.
type ActionFormat<P = undefined> = {type: string} & (P extends undefined ? {} : {payload: P}) export function createAction<P = undefined>(type: string): (payload?: P) => ActionFormat { const actionCreator = (payload?: P) => ({ type, payload: payload }); return actionCreator; }Creación de acciones
const startFetch = createAction('START_FETCH'); const successFetch = createAction<number>('SUCCESS_FETCH')Ejecutar acciones
startFetch(); //there are no errors. No payload required startFetch('test'); //must be an error Payload has been submitted successFetch(); //must be an error Payload was not submitted successFetch(123); // there are no errors.Puede usar un tipo condicional para extender un tipo de tupla a un parámetro de descanso, haciendo que el parámetro sea obligatorio o no en función de si P se extiende undefined (es decir, no está undeinfed o es una unión que contiene indefinido)
export function createAction<P = undefined>(type: string): (...payload: P extends undefined ? [payload?: P] // P === undefined, no parameters required, but pay be passed in. : [payload: P] //P does not contain undefined parameter is required ) => ActionFormat { const actionCreator = (payload?: P) => ({ type, payload: payload }); return actionCreator; }