将变量的类型用作另一个typescript的类型

将变量的类型用作另一个typescript的类型,typescript,redux,Typescript,Redux,是否可以将一个常量的值用作另一个常量的文本类型? 我的用例是特定于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

是否可以将一个常量的值用作另一个常量的文本类型? 我的用例是特定于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
}
interface ModalCloseActionI {
    type: types.MODAL_OPEN,
    payload: number,
}

interface ModalOpenActionI {
    type: types.MODAL_CLOSE
    payload: JSX.Element
}
因此,我可以说我的reducer需要一个类型为
ModalOpenActionI | ModalCloseActionI

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;
        }
    }
}
export const modalReducer=(state=Immutable.List(),action:ModalOpenActionI | ModalCloseActionI)=>{
const{type,payload}=action;
开关(类型){
打开的情况:{
返回状态。推送(有效载荷);
}
案例模式(U)关闭:{
返回状态。移除(有效载荷作为编号);
}
默认值:{
返回状态;
}
}
}
因此,我的开关案例是类型安全的,编译器可以假设在
MODAL_OPEN
中,有效负载实际上是一个
JSX.Element


有没有一种方法可以在不编写太多重复代码的情况下完成此操作?

您试图将值用作类型,但这不起作用。
好消息是,您可以使用相同的名称定义类型:

const { MODAL_OPEN, MODAL_CLOSE } = types;
type MODAL_OPEN = string;
type MODAL_CLOSE = string;
这应该会让它起作用


编辑 如果希望类型为单个字符串文字,请执行以下操作:

interface ModalCloseActionI extends BaseActionI {
    type: "close",
    payload: number,
}

interface ModalOpenActionI extends BaseActionI {
    type: "open"
    payload: JSX.Element
}
如果字符串值不是静态的,您将无法执行此操作,这是您创建字符串时的情况,如下所示:

const MODAL_OPEN = `${APP_NAME}/MODAL/OPEN`;

第二版 即使使用静态字符串文字,您仍然需要将其声明为类型:

const { MODAL_OPEN, MODAL_CLOSE } = types;
type MODAL_OPEN = "MODAL/OPEN";
type MODAL_CLOSE = "MODAL/CLOSE";
这很烦人,因为您需要重新声明每个变量,并且字符串值中存在重复(这可能会导致错误)

可以导出命名空间而不是常量:

export namespace types {
    export const MODAL_OPEN = `MODAL/OPEN`;
    export type MODAL_OPEN = "MODAL/OPEN";

    export const MODAL_CLOSE = `MODAL/CLOSE`;
    export type MODAL_CLOSE = "MODAL/CLOSE";
}
那么定义就在同一个地方,但您需要这样使用它:

interface ModalCloseActionI extends BaseActionI {
    type: MODAL_OPEN,
    payload: number,
}

interface ModalOpenActionI extends BaseActionI {
    type: MODAL_CLOSE
    payload: JSX.Element
}
interface ModalCloseActionI {
    type: types.MODAL_OPEN,
    payload: number,
}

interface ModalOpenActionI {
    type: types.MODAL_CLOSE
    payload: JSX.Element
}

对不起,我的问题不清楚。我希望类型是字符串文本。但是如果我把变量设为静态,它也不起作用。没有办法吗?非常感谢。每件事都写两次,switch语句对于类型保护来说效果不太好,但它确实有效。非常感谢