Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Const变量作为type-Typescript_Typescript_React Native_Types_Constants_Reducers - Fatal编程技术网

Const变量作为type-Typescript

Const变量作为type-Typescript,typescript,react-native,types,constants,reducers,Typescript,React Native,Types,Constants,Reducers,在学习打字脚本的过程中,我遇到了一个问题,当我使用带有动作值的常量变量时,我使用它来减少(创建该变量是为了防止打字错误——我在某个地方读到过这是一个很好的实践) 我还创建了用于定义减速器动作的类型: type InputReducerAction = | { type: INPUT_CHANGE; value: string; isValid: boolean } | { type: INPUT_BLUR }; 这是我的减速机: const inputReducer = (state:

在学习打字脚本的过程中,我遇到了一个问题,当我使用带有动作值的常量变量时,我使用它来减少(创建该变量是为了防止打字错误——我在某个地方读到过这是一个很好的实践)

我还创建了用于定义减速器动作的类型:

type InputReducerAction =
  | { type: INPUT_CHANGE; value: string; isValid: boolean }
  | { type: INPUT_BLUR };
这是我的减速机:

const inputReducer = (state: InputReducerState, action: InputReducerAction) => {
  switch (action.type) {
    case INPUT_CHANGE:
      return {
        ...state,
        value: action.value,
        isValid: action.isValid,
      };
    case INPUT_BLUR:
      return {
        ...state,
        touched: true,
      };
    default:
      return state;
  }
};
当我在
inputEducationAction
中有上面的
INPUT\u CHANGE
INPUT\u BLUR
这样的所有链接时,都标记为错误:

“INPUT_CHANGE”指的是一个值,但在此处用作类型。你的意思是“输入类型变化”吗?ts(2749)

“INPUT_BLUR”指的是一个值,但在此处用作类型。你是说“输入类型模糊”吗?ts(2749)

当我对这个常量使用双引号时,问题就消失了,就像这样

type InputReducerAction =
  | { type: "INPUT_CHANGE"; value: string; isValid: boolean }
  | { type: "INPUT_BLUR" };
但是我的常量变量现在是无用的。我做错了什么或错过了什么

在写这个问题的过程中,我想到了使用enum:

enum INPUT_ACTION {
  INPUT_CHANGE = "INPUT_CHANGE",
  INPUT_BLUR = "INPUT_BLUR"
}

type InputReducerAction =
  | { type: INPUT_ACTION.INPUT_CHANGE; value: string; isValid: boolean }
  | { type: INPUT_ACTION.INPUT_BLUR };

const inputReducer = (state: InputReducerState, action: InputReducerAction) => {
  switch (action.type) {
    case INPUT_ACTION.INPUT_CHANGE:
      return {
        ...state,
        value: action.value,
        isValid: action.isValid,
      };
    case INPUT_ACTION.INPUT_BLUR:
      return {
        ...state,
        touched: true,
      };
    default:
      return state;
  }
};
并将其应用于减速器和类型中。错误会消失,但这是一个好主意还是我可以用更好的方式来做这件事

您可以用它来做您所描述的事情

const INPUT\u CHANGE=“INPUT\u CHANGE”作为常量;
const INPUT\u BLUR=“INPUT\u BLUR”作为常量;
输入型营养作用=
|{type:typeof INPUT_CHANGE;value:string;isValid:boolean}
|{type:typeof INPUT_BLUR};
const changeAction:inputEducationAction={
类型:输入\更改,值:“”,isValid:false
};
常量模糊操作:InputAction={
类型:输入模糊
};

问题是JavaScript变量只在运行时分配值,TypeScript需要在编译时知道。使用const断言是一种通知编译器其值不应更改的方法。当您获取变量的
类型时,请使用文本值,而不是通常分配给变量的泛型
字符串
类型。

但是,我通常更喜欢使用枚举。特别是在我可能要枚举值的情况下。
enum INPUT_ACTION {
  INPUT_CHANGE = "INPUT_CHANGE",
  INPUT_BLUR = "INPUT_BLUR"
}

type InputReducerAction =
  | { type: INPUT_ACTION.INPUT_CHANGE; value: string; isValid: boolean }
  | { type: INPUT_ACTION.INPUT_BLUR };

const inputReducer = (state: InputReducerState, action: InputReducerAction) => {
  switch (action.type) {
    case INPUT_ACTION.INPUT_CHANGE:
      return {
        ...state,
        value: action.value,
        isValid: action.isValid,
      };
    case INPUT_ACTION.INPUT_BLUR:
      return {
        ...state,
        touched: true,
      };
    default:
      return state;
  }
};