我正在尝试通过从互联网上获取一些示例来学习redux,但是我遇到了TypeScript错误,我不知道该如何解决...
我在同一目录中有两个文件... constants.ts 和 types.ts 。
constants.ts 导出包含字符串值的Actions常量:
// constants.ts
export const Actions = {
ADD: 'ADD',
TOGGLE: 'TOGGLE',
};
types.ts 包含一个ActionType,该类型将用于在Redux reducer函数中指定参数类型...它使用Actions常量,如下所示:
// types.ts
import { Actions } from "./constants";
export type ActionType = {
cmd: Actions.ADD | Actions.TOGGLE,
data: any
};
我正在尝试定义ActionType.cmd属性,使其只能是'ADD'或'TOGGLE'...
如果我直接写这些值,例如:
cmd: 'ADD' | 'TOGGLE'
一切正常...但是当我尝试使用Actions常量中定义的字符串值时,出现 TS2503 错误,提示'找不到命名空间操作' >。
这可能吗,还是我错过了什么?请帮忙!
答案 0 :(得分:1)
由于您已将Actions
定义为常量,因此Actions.ADD
仅可用作值,而不可用作类型。考虑改用枚举:
export enum Actions {
ADD = 'ADD',
TOGGLE = 'TOGGLE',
};
export type ActionType = {
cmd: Actions, // short for Actions.ADD | Actions.TOGGLE
data: any
};
枚举的成员可以用作值和文字类型。
答案 1 :(得分:1)
据我了解,您不能直接将Actions.ADD
的值用作类型。
您可以使用typeof
来获取值的类型,并使用keyof
来获取键,因此,如果键的名称和值相同,则可以使用以下内容。
type ActionType = {
cmd: keyof typeof Actions,
data: any
};