如何解决TS2322:类型““ Friendly””不能分配给类型“ SoftSkillsEnum”
我正在尝试实现由字符串组成的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”)。
无论如何,还是必须放弃我的枚举实现尝试?
解决方法
不确定为什么要使用枚举,但是如果要将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,async () => {
const id = '19'
const token = 'a64a47cc4c3c6282c229df78aab373c3d0dd94c4'
const newSkill = 'FRIENDLY'
await service.addSkills(id,[newSkill])
const recordedSkills = service.getCandidateSkills(id)
expect(recordedSkills).toContain('')
})
但是请注意,SoftSkills
现在是ALL CAPS中所有技能的列表,因为这是枚举的定义方式。
或者也许只是为您的newSkill
使用枚举?
...
const newSkill = SoftSkillsEnum.FRIENDLY
await service.addSkills(id,[newSkill])
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。