TS2322:类型““ Friendly””不能分配给类型“ SoftSkillsEnum”

时间:2020-09-09 00:46:47

标签: string typescript enums

我正在尝试实现由字符串组成的Enum,以使我的代码更健壮。

方法addSkills()接收了一个技巧参数,该参数是一个字符串数组。

这是测试代码:

    it('should record skills into database', async () => {
      const id = '19'
      const token = 'a64a47cc4c3c6282c229df78aab373c3d0dd94c4'
      const newSkill = 'Friendly'
      await service.addSkills(id, token, [newSkill])
      const recordedSkills = service.getCandidateSkills(id)
      expect(recordedSkills).toContain('Friendly')
    })
  })

这是临时生产代码:

async addSkills(
    id: string,
    token: string,
    skills: SoftSkillsEnum[]
  ): Promise<[] | null> {
    throw new HttpException('Unknown resource', HttpStatus.NOT_FOUND)
  }

export enum SoftSkillsEnum {
  CREATIVE = 'Creative',
  FUNNY = 'Funny',
  EMPATHETIC = 'Empathetic',
  EXPLORER = 'Explorer',
  SPORTY = 'Sporty',
  SUPER_SMART = 'Super Smart',
  FRIENDLY = 'Friendly',
}

测试代码在测试代码的第5行触发Typescript错误: TS2322: Type '"Friendly"' is not assignable to type 'SoftSkillsEnum'.

据我了解,Typescript在字符串和由字符串组成的枚举之间产生区别。但是我不希望我的方法接受任何字符串,输入应该匹配预定义的字符串列表(预定义的“ softsSkills”)。

无论如何,还是必须放弃我的枚举实现尝试?

1 个答案:

答案 0 :(得分:2)

不确定为什么要使用枚举,但是如果要将skills限制为字符串的子集,则可以使用联合类型,例如

export type SoftSkills = 'Creative' | 'Funny' | ... | 'Friendly';

...

async addSkills(
    id: string,
    token: string,
    skills: SoftSkills[]
  ): Promise<[] | null> {
    throw new HttpException('Unknown resource', HttpStatus.NOT_FOUND)
  }

    it('should record skills into database', async () => {
      const id = '19'
      const token = 'a64a47cc4c3c6282c229df78aab373c3d0dd94c4'
      const newSkill = 'Friendly'
      await service.addSkills(id, token, [newSkill])
      const recordedSkills = service.getCandidateSkills(id)
      expect(recordedSkills).toContain('')
    })

如果您需要运行时访问列表(例如进行验证),或者确定需要枚举,则可以获取枚举的键:

type SoftSkills = keyof(typeof SoftSkillsEnum);

...

async addSkills(
    id: string,
    token: string,
    skills: SoftSkills[]
  ): Promise<[] | null> {
    throw new HttpException('Unknown resource', HttpStatus.NOT_FOUND)
  }

    it('should record skills into database', async () => {
      const id = '19'
      const token = 'a64a47cc4c3c6282c229df78aab373c3d0dd94c4'
      const newSkill = 'FRIENDLY'
      await service.addSkills(id, token, [newSkill])
      const recordedSkills = service.getCandidateSkills(id)
      expect(recordedSkills).toContain('')
    })

但是请注意,SoftSkills现在是ALL CAPS中所有技能的列表,因为这是枚举的定义方式。

或者也许只是为您的newSkill使用枚举?

...
      const newSkill = SoftSkillsEnum.FRIENDLY
      await service.addSkills(id, token, [newSkill])
...