指定对象字段是枚举的属性

时间:2018-06-24 06:48:41

标签: typescript

如何键入以下结构:

const fields: any = {
  [AuthForms.LoginForm]: ['email', 'password'],
  [AuthForms.ForceChangePasswordForm]: ['password', 'confirmPassword'],
  [AuthForms.ForgottenPasswordForm]: ['email'],
  [AuthForms.ResetPasswordForm]: ['email', 'password', 'confirmPassword']
};

我在下面尝试过,但是语法不太正确

const fields: { [keyof AuthForms]: string[] } = {
  [AuthForms.LoginForm]: ['email', 'password'],
  [AuthForms.ForceChangePasswordForm]: ['password', 'confirmPassword'],
  [AuthForms.ForgottenPasswordForm]: ['email'],
  [AuthForms.ResetPasswordForm]: ['email', 'password', 'confirmPassword']
};

1 个答案:

答案 0 :(得分:1)

为便于记录,您应该可以完全省略类型注释,并使用TS推断的类型。那是我个人要做的,但是如果您由于某种原因而不能...

索引签名({ [key: string]: SomeType }语法)仅接受键的类型为stringnumber。为了指定特定的键,您需要使用mapped type.

请记住:只需指定SomeEnum即可指定SomeEnum键的类型,因此这里不需要keyof

const fields: { [K in AuthForms]: string[] } = {

您还可以选择更具可读性的Record类型,该类型是为像这样的简单情况而设计的。这和上面的一样:

const fields: Record<AuthForms, string[]> = {