我正在编写Reducer函数,它接受具有类型属性的操作,该属性的类型是Enum类型,而操作有效负载取决于Enum类型.

我知道我可以使用联合类型为每种枚举类型提供不同的有效负载类型,但是我有一个操作,它的有效负载是Date,而所有其他操作的有效负载类型都是Numbers.

What I've tried

enum DatePickerActionType {
    PICK_YEAR = 'PICK_YEAR',
    PICK_MONTH = 'PICK_MONTH',
    PICK_DATE = 'PICK_DATE',
    PICK_HOURS = 'PICK_HOURS',
    PICK_MINUTES = 'PICK_MINUTES',
}

type DatePickerAction =
    | {
          type: DatePickerActionType.PICK_DATE;
          payload: Date;
      }
    | {
          type: DatePickerActionType;
          payload: number;
      };

const datePickerReducer = (state: DatePickerValue, action: DatePickerAction): DatePickerValue => {
    switch (action.type) {
        case DatePickerActionType.PICK_DATE: {
            const a = action.payload;
        }
        //...
    }
};

However typescript still shows me action.type as number or Date when action type is PICK_DATE Reducer function

有没有办法将除枚举类型以外的所有操作的有效负载类型定义为数字,或者我应该使用联合类型来分别定义所有操作?

type DatePickerAction =
    | {
          type: DatePickerActionType.PICK_DATE;
          payload: Date;
      }
    | {
          type: DatePickerActionType.PICK_HOURS;
          payload: number;
      }
    | {
          type: DatePickerActionType.PICK_MINUTES;
          payload: number;
      }
    | {
          /**... */
      };

推荐答案

try Exclude特定的枚举:

// ...

type DatePickerAction =
    | {
        type: DatePickerActionType.PICK_DATE;
        payload: Date;
    }
    | {
        type: Exclude<DatePickerActionType, DatePickerActionType.PICK_DATE>;
        payload: number;
    };


const datePickerReducer = (state: DatePickerValue, action: DatePickerAction): DatePickerValue => {
    switch (action.type) {
        case DatePickerActionType.PICK_DATE: {
            const a = action.payload; // Date
            break;
        }
        default: {
            const a = action.payload; // number
        }
        //...
    }
};

TS Playground

Typescript相关问答推荐

类型断言添加到类型而不是替换

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

TypeScript泛型参数抛出错误—?&#"' 39;预期"

有没有一种方法可以在保持类型的可选状态的同时更改类型?

如何将联合文字类型限制为文字类型之一

Angular 错误NG0303在Angular 项目中使用app.Component.html中的NGFor

如何将CSV/TXT文件导入到服务中?

有没有可能产生输出T,它在视觉上省略了T中的一些键?

通过泛型函数本身推断受约束的泛型参数的类型脚本问题

不带其他属性的精确函数返回类型

APP_INITIALIZER在继续到其他Provider 之前未解析promise

如何缩小函数的返回类型?

从route.参数获取值.订阅提供";无法读取未定义";的属性

为什么发送空字段?

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

从以下内容之一提取属性类型

窄SomeType与SomeType[]

我可以使用对象属性的名称作为对象中的字符串值吗?

如果父级被删除或删除,如何自动删除子级?

对象可能未定义(通用)