【发布时间】:2017-02-09 16:48:01
【问题描述】:
是否可以将常量的值用作另一个常量的字面量类型? 我的用例是 Redux 特定的,但也可以在其他地方使用。
我的动作定义如下:
import { APP_NAME } from 'js/commons/constants/ReduxAppName';
const MODAL_OPEN = `${APP_NAME}/MODAL/OPEN`;
const MODAL_CLOSE = `${APP_NAME}/MODAL/CLOSE`;
export const types = {
MODAL_OPEN,
MODAL_CLOSE,
};
现在我在 reducer 中导入这些类型:
import { types } from './modalTypes';
import { BaseActionI } from 'js/redux/interfaces/ReduxInterfaces';
const { MODAL_OPEN, MODAL_CLOSE } = types;
我想让我的减速器类型安全。动作的有效负载可以是数字(关闭时)或 JSX.Element(打开时)。
所以我想写这样的东西:
interface ModalCloseActionI extends BaseActionI {
type: MODAL_OPEN,
payload: number,
}
interface ModalOpenActionI extends BaseActionI {
type: MODAL_CLOSE
payload: JSX.Element
}
那么我可以说我的 reducer 需要 ModalOpenActionI | ModalCloseActionI 类型的 Action
export const modalReducer = (state = Immutable.List<JSX.Element>(), action: ModalOpenActionI | ModalCloseActionI) => {
const { type, payload } = action;
switch (type) {
case MODAL_OPEN: {
return state.push(payload);
}
case MODAL_CLOSE: {
return state.remove(payload as number);
}
default: {
return state;
}
}
}
那么我的 switch case 是类型安全的,编译器可以假设在 MODAL_OPEN 内部,有效负载实际上是 JSX.Element
有没有办法在不编写大量重复代码的情况下实现这一点?
【问题讨论】:
标签: typescript redux