尝试使用导入的字符串常量来限制打字稿类型文字

时间:2018-09-01 20:54:35

标签: typescript

我正在尝试通过从互联网上获取一些示例来学习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 错误,提示'找不到命名空间操作' >。

这可能吗,还是我错过了什么?请帮忙!

2 个答案:

答案 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
};