TypeScript中number类型赋值给自定义数字联合类型报错如何解决?
出现这个报错是因为Math.floor(Math.random() * 6)的返回值类型是宽泛的number,而TypeScript不会自动推导普通number值是否符合你定义的数字字面量联合类型的取值范围,所以会抛出类型不匹配的错误。
解决方案1:使用类型断言
如果你能100%保证运行时生成的数值一定落在0-5的范围内,直接用as做类型断言即可,这是最简便的写法:
export type CustomType = 0 | 1 | 2 | 3 | 4 | 5; // 直接断言生成的结果为CustomType类型 const myVar: CustomType = Math.floor(Math.random() * 6) as CustomType;
解决方案2:添加类型守卫(更安全)
如果想要避免后续代码迭代时出现超出范围的异常值,推荐写类型守卫做运行时校验,TypeScript会自动识别校验通过后的变量符合CustomType类型,不需要额外做断言:
export type CustomType = 0 | 1 | 2 | 3 | 4 | 5; // 自定义类型守卫 function isCustomType(value: number): value is CustomType { return [0, 1, 2, 3, 4, 5].includes(value); } const randomVal = Math.floor(Math.random() * 6); let myVar: CustomType = 0; if (isCustomType(randomVal)) { myVar = randomVal; // 此处TS可以自动推断类型匹配,不会报错 } else { // 可自定义异常兜底逻辑,比如赋值默认值 myVar = 0; }
内容的提问来源于stack exchange,提问作者0kMike
相关产品推荐
相关产品推荐

