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
相关产品推荐
相关产品推荐

