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

TypeScript:如何确保数组包含常量对象全部键并触发类型报错?

解决方案

方法一:自动生成数组(无需手动维护)

直接通过Object.keys()动态获取枚举对象的所有键,同时用类型断言确保类型准确性:

export const Status = {
    'ACTIVE': 'Active',
    'DELETED': 'Deleted'
} as const;

export type StatusKeys = keyof typeof Status;
export type StatusValues = typeof Status[StatusKeys];

// 自动同步Status的所有键,无需手动修改数组
export const ArrayStatus = Object.keys(Status) as StatusKeys[];

// 若需要更严格的只读元组类型:
// export const ArrayStatus = Object.keys(Status) as readonly StatusKeys[];

当你增删Status的条目时,ArrayStatus会在运行时自动同步更新,TypeScript的类型也会随之更新,完全不会出现键缺失的问题,也不需要维护额外变量。

方法二:手动维护数组,但强制校验完整性

如果必须手动维护数组,可通过工具类型实现编译时校验,确保数组包含所有枚举键:

export const Status = {
    'ACTIVE': 'Active',
    'DELETED': 'Deleted'
} as const;

export type StatusKeys = keyof typeof Status;
export type StatusValues = typeof Status[StatusKeys];

// 工具类型:检查数组是否包含所有指定键
type MustIncludeAllKeys<T extends string | number | symbol, U extends T[]> = 
  Exclude<T, U[number]> extends never ? U : never;

// 数组缺失键时,TypeScript会直接抛出类型错误
export const ArrayStatus: MustIncludeAllKeys<StatusKeys, StatusKeys[]> = ['ACTIVE', 'DELETED'];

// 若需只读元组,可使用TS 4.9+新增的satisfies关键字:
// export const ArrayStatus = ['ACTIVE', 'DELETED'] as const satisfies MustIncludeAllKeys<StatusKeys, typeof ArrayStatus>;

当Status增删条目后,如果数组未同步更新,TypeScript会立即报错提醒你修改数组,确保两者始终一致。

内容的提问来源于stack exchange,提问作者Andrew Berridge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:50