Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String TS2322:类型'&引用;友好的';不可分配给类型';SoftSkillsEnum';_String_Typescript_Enums - Fatal编程技术网

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允许开发