Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

140
Visualizações
El tipo de protección de la caja del interruptor del reductor de mecanografiado no funciona con la propagación de objetos

Tengo un reductor que realiza diferentes acciones según el action.type de acción, la carga útil de las acciones es diferente para ciertas acciones.

 export enum ActionType { UpdateEntireState = "UPDATE_ENTIRE_STATE", UpdateStateItem = "UPDATE_STATE_ITEM" } type TypeEditData = { id: string; name: string; surname: string; age: number; }; export type State = TypeEditData[]; export type Action = UpdateEntireState | UpdateStateItem; type UpdateEntireState = { type: ActionType.UpdateEntireState; payload: State; }; type UpdateStateItem = { type: ActionType.UpdateStateItem; payload: { id: string; data: TypeEditData }; }; export function reducer(state: State, action: Action): State { const { type, payload } = action; switch (type) { case ActionType.UpdateEntireState: { return [...payload]; } case ActionType.UpdateStateItem: { const person = state.filter((item) => item.id === payload.id); return [...state, person[0]]; } default: { throw Error("Wrong type of action!"); } } }

Este código no funcionará, los errores dirán que mi carga útil de acción puede ser State o { id: string; data: TypeEditData } . Sin embargo, si accedo a la propiedad de carga útil dentro de la caja del interruptor usando notación de puntos como esta

 return [...action.payload];

No habrá ningún error y el tipo de protección funcionará bien. Cómo const { type, payload } = action; difiere de action.type y action.payload en términos de tipos y ¿por qué typeguard no funciona con sintaxis extendida?

Versión TS - 4.3.4

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

El problema es que definió la payload antes de que hubiera información de tipo disponible en action , por lo que tiene el tipo de unión

 State | { id: string; data: TypeEditData; };

Defina una variable local o simplemente use action.payload dentro de cada declaración de caso y el compilador sabrá qué tipo tiene:

 export function reducer(state: State, action: Action): State { // const { type, payload } = action; switch (action.type) { case ActionType.UpdateEntireState: { return [...action.payload]; } case ActionType.UpdateStateItem: { const person = state.filter((item) => item.id === action.payload.id); return [...state, person[0]]; } default: { throw Error("Wrong type of action!"); } } }

El tipo de variable se establece explícitamente en la declaración (por ejemplo, const a: string ) o implícitamente en la inicialización (por ejemplo a = 4 ). Las construcciones de protección de tipos posteriores no se utilizan para volver a evaluar el tipo de la variable. Por el contrario, dado que el tipo de la variable ya está definido en ese punto, ese tipo se utiliza para validar si la construcción posterior es válida para la variable.

about 4 years ago · Juan Pablo Isaza Relatório

0

La interfaz de acción por defecto viene con la propiedad de tipo.

 export interface Action { type: string; }

Si puede extender la interfaz de Acción para agregar la carga útil como una matriz de objetos, el mecanografiado no arrojará un error. Algo como esto, en su función reductora puede usar así

 interface CustomAction extends Action{ payload: Array<any> } export function reducer(state: State, action: CustomAction): State {
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda