能否用数组变量定义TypeScript类型?含类型校验报错问题
问题背景
我定义了如下常量对象:
const STATUS = { ACTIVE: "ACTIVE", DELETED: "DELETED", }
还有一个接收status参数的函数:
const handleStatus = (status) { //do some thing }
我想为status参数定义仅接受'ACTIVE'和'DELETED'的类型,目前只能手动定义联合类型:
type Status = 'ACTIVE' | 'DELETED' const handleStatus = (status : Status) { //do some thing }
请问能否通过类似type Status = Object.values(STATUS)的方式实现?
补充问题
我尝试用type Status = (typeof STATUS)[keyof typeof STATUS]定义了类型,但在执行以下校验时:
const validStatus = Object.values(STATUS) if(!validStatus.includes(status)) { //do something }
TypeScript抛出错误:Argument of type 'string' is not assignable to parameter of type ...,该如何解决?
解决方案
1. 基于常量对象自动生成联合类型
可以通过typeof结合keyof自动推导类型,无需手动编写联合类型,关键是给常量对象添加as const断言:
const STATUS = { ACTIVE: "ACTIVE", DELETED: "DELETED", } as const; // 让TypeScript将属性值推断为字面量类型,而非宽泛的string type Status = (typeof STATUS)[keyof typeof STATUS]; // 此时Status的类型就是 'ACTIVE' | 'DELETED'
as const会强制TypeScript把对象的属性值锁定为具体的字符串字面量,这样后续推导的联合类型才会精确匹配常量的取值。
2. 解决includes类型报错问题
TypeScript默认会把Object.values(STATUS)的类型推断为string[],和Status类型不兼容,导致报错,有三种解决方式:
方法一:给有效值数组指定精确类型
const validStatus: Status[] = Object.values(STATUS); if (!validStatus.includes(status)) { // 此处不再报错 }
方法二:对includes的参数做类型断言
const validStatus = Object.values(STATUS); if (!validStatus.includes(status as Status)) { // 类型不匹配问题解决 }
方法三:使用类型守卫函数增强严谨性
如果需要更严格的类型校验,可以自定义类型守卫:
const validStatus = Object.values(STATUS); function isStatus(value: unknown): value is Status { return typeof value === 'string' && validStatus.includes(value as Status); } // 使用示例 if (!isStatus(status)) { // 这里TypeScript会自动识别status为非Status类型,可针对性处理错误 }
内容的提问来源于stack exchange,提问作者vy.pham
相关产品推荐
相关产品推荐

