String TS2322:类型'&引用;友好的';不可分配给类型';SoftSkillsEnum';
我试图实现一个由字符串组成的枚举,以使代码更加健壮 方法String TS2322:类型'&引用;友好的';不可分配给类型';SoftSkillsEnum';,string,typescript,enums,String,Typescript,Enums,我试图实现一个由字符串组成的枚举,以使代码更加健壮 方法addSkills()收到了一个技能参数,它是一个字符串数组 以下是测试代码: it('should record skills into database', async () => { const id = '19' const token = 'a64a47cc4c3c6282c229df78aab373c3d0dd94c4' const newSkill = 'Friendly'
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',
}
async addSkills(
id:string,
令牌:字符串,
技能:SoftSkillsEnum[]
):承诺{
抛出新的HttpException('Unknown resource',HttpStatus.NOT\u FOUND)
}
导出枚举软件{
创造性=‘创造性’,
好笑=‘好笑’,
移情=‘移情’,
EXPLORER='EXPLORER',
运动型=‘运动型’,
超级智能=‘超级智能’,
友好=‘友好’,
}
测试代码触发测试代码第5行的Typescript错误:
TS2322:类型“Friendly”不可分配给类型“SoftSkillsEnum”。
据我所知,Typescript在字符串和由字符串组成的枚举之间起着不同的作用。但是我不希望我的方法接受任何字符串,输入应该匹配预定义的字符串列表(预定义的“softsSkills”)
无论如何,要使其正常工作,或者我必须放弃枚举实现尝试?不确定为什么要使用枚举,但如果要将
技能限制为字符串的子集,可以使用union类型,例如
export-type SoftSkills='Creative'|'fully'|……|'友好",;
...
异步addSkills(
id:string,
令牌:字符串,
技能:软技能[]
):承诺{
抛出新的HttpException('Unknown resource',HttpStatus.NOT\u FOUND)
}
it('should record skills to database',async()=>{
常量id='19'
常量标记='A64A47CC4C6282C229DF78AAB373C3D0DD94C4'
const newSkill='Friendly'
等待服务。addSkills(id,令牌,[newSkill])
const recordedSkills=service.getCandidateSkills(id)
期望(记录技能)。继续(“”)
})
如果您需要运行时访问列表(例如用于验证),或者您确定需要枚举,则可以获取枚举的键:
type SoftSkills=keyof(type of SoftSkillsEnum);
...
异步addSkills(
id:string,
令牌:字符串,
技能:软技能[]
):承诺{
抛出新的HttpException('Unknown resource',HttpStatus.NOT\u FOUND)
}
it('should record skills to database',async()=>{
常量id='19'
常量标记='A64A47CC4C6282C229DF78AAB373C3D0DD94C4'
const newSkill='FRIENDLY'
等待服务。addSkills(id,令牌,[newSkill])
const recordedSkills=service.getCandidateSkills(id)
期望(记录技能)。继续(“”)
})
但请注意,现在的SoftSkills
是所有CAP中的技能列表,因为枚举就是这样定义的
或者可能只是将枚举用于您的新闻kill
。。。
const newSkill=SoftSkillsEnum.FRIENDLY
等待服务。addSkills(id,令牌,[newSkill])
...
不确定为什么需要枚举,但如果要将技能
限制为字符串的子集,可以使用联合类型,例如
export-type SoftSkills='Creative'|'fully'|……|'友好",;
...
异步addSkills(
id:string,
令牌:字符串,
技能:软技能[]
):承诺{
抛出新的HttpException('Unknown resource',HttpStatus.NOT\u FOUND)
}
it('should record skills to database',async()=>{
常量id='19'
常量标记='A64A47CC4C6282C229DF78AAB373C3D0DD94C4'
const newSkill='Friendly'
等待服务。addSkills(id,令牌,[newSkill])
const recordedSkills=service.getCandidateSkills(id)
期望(记录技能)。继续(“”)
})
如果您需要运行时访问列表(例如用于验证),或者您确定需要枚举,则可以获取枚举的键:
type SoftSkills=keyof(type of SoftSkillsEnum);
...
异步addSkills(
id:string,
令牌:字符串,
技能:软技能[]
):承诺{
抛出新的HttpException('Unknown resource',HttpStatus.NOT\u FOUND)
}
it('should record skills to database',async()=>{
常量id='19'
常量标记='A64A47CC4C6282C229DF78AAB373C3D0DD94C4'
const newSkill='FRIENDLY'
等待服务。addSkills(id,令牌,[newSkill])
const recordedSkills=service.getCandidateSkills(id)
期望(记录技能)。继续(“”)
})
但请注意,现在的SoftSkills
是所有CAP中的技能列表,因为枚举就是这样定义的
或者可能只是将枚举用于您的新闻kill
。。。
const newSkill=SoftSkillsEnum.FRIENDLY
等待服务。addSkills(id,令牌,[newSkill])
...
非常感谢您提供了这一信息丰富的答案。但enum的目的不是“将技能限制在字符串的子集”(例如)吗?从TypeScript文档本身可以看出:“enum允许开发人员定义一组命名常量。使用enum可以更容易地记录意图,或创建一组不同的案例。”这让我对应该使用什么产生了疑问。我很高兴有你的想法。我选择了类型联合而不是枚举。谢谢。@AMehmeto我想说枚举定义了一组“选项”,而不一定是字符串。我添加了一个直接使用enum的建议,但是如果newSkill
是一些用户输入(这是一个字符串),那就不会真正起作用。我主要使用enum来实现“命名常量”的目的,例如LEFT=0b1、RIGHT=0b10等。如果没有上下文,数字本身很难理解。这里有一篇我觉得对这个话题很有用的帖子:非常感谢你提供了这个信息丰富的答案。但是,enum的目的之一不是要“将技能限制在字符串的子集”(例如)吗?TypeScript文档本身这样写道:“enum允许开发