我正在尝试实现由字符串组成的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”)。
无论如何,还是必须放弃我的枚举实现尝试?
答案 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])
...