字符串文字类型,在Typescript中包含变量

时间:2016-04-08 11:58:19

标签: typescript

我的代码:

export const LOAD_USERS = 'LOAD_USERS';
export const CREATE_USER = 'CREATE_USER';
export interface ACTION {
  type: string,
  payload: any
}

我想将ACTION.type限制为'LOAD_USERS'或'CREATE_USERS'。 我可以通过String Literal type: 'LOAD_USERS'|'CREATE_USERS'来做到这一点。但是不能用变量type: LOAD_USERS | CREATE_USERS来做。我的编辑器提示“找不到名字'LOAD_USERS'”。 有没有办法使用变量来做到这一点?在多个地方输入相同的字符串时可能会出现拼写错误。

5 个答案:

答案 0 :(得分:11)

如果要确保变量中的字符串是操作类型,则应使用类型别名并使用该类型显式键入变量:

ActionTypes

如果变量中的字符串与export type ActionTypes = 'LOAD_USERS' | 'CREATE_USER'; export const LOAD_USERS: ActionTypes = 'LOAD_USERS_TYPO'; // error, good export const CREATE_USER: ActionTypes = 'CREATE_USER'; 中的某个字符串不匹配,那么您将收到一个错误,这是为了防止错误。例如,这会出错:

{{1}}

答案 1 :(得分:8)

您可以使用typeof运算符,它返回推断类型:

export const LOAD_USERS = 'LOAD_USERS';
export const CREATE_USER = 'CREATE_USER';
export interface ACTION {
  type: typeof LOAD_USERS | typeof CREATE_USER,
  payload: any
}

答案 2 :(得分:4)

从TypeScript 2.4开始,您可以使用包含字符串成员的枚举。枚举定义了一组命名常量。

export enum UserActions{
    LOAD_USERS = "LOAD_USERS",
    CREATE_USER = "CREATE_USER"
}

export interface ACTION {
    type: UserActions,
    payload: any
}

答案 3 :(得分:2)

你不能完全消除重复,但你可以将它减少到最低限度:

type nameIt = 'LOAD_USERS' | 'CREATE_USERS'
export const LOAD_USERS = 'LOAD_USERS';
export const CREATE_USER = 'CREATE_USER';

这允许您在其他地方使用nameIt类型,但它确实意味着在常量和类型中重复字符串。

或者,如果您要编写新代码,则可能更喜欢使用enum

答案 4 :(得分:2)

进一步简化现有答案,

export type ActionTypes = 'LOAD_USERS' | 'CREATE_USER';

本身就足够了。要引用特定的操作类型,只需使用带引号的字符串文字:

'LOAD_USERS'

在其他一些语言中,我们避免重复这样的字符串文字,而更喜欢用声明来命名它们。但那是因为那些其他语言没有字符串文字类型!在TypeScript中,'LOAD_USERS'已经 是静态可检查类型的编译时名称。你不一定要给它另一个名字。

示例:

declare function doAction(action: ActionTypes);

doAction('LOAD_USERS'); // okay

doAction('LOAD_USES'); // error: typo is caught by compiler