我的代码:
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'”。
有没有办法使用变量来做到这一点?在多个地方输入相同的字符串时可能会出现拼写错误。
答案 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