You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用数组变量定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:01:02