如何为const数组指定类型?遇类型不兼容错误求助
解决TypeScript中
as const与(keyof MyType1)[]类型不兼容的问题 问题场景
原本通过as const定义了只读字符串数组,并基于它推导元素类型:
export const tableColumns = [ 'propName1', 'propName2', 'propNameX' ] as const; export type tableColumns = (typeof tableColumns)[number];
现在希望约束数组元素必须是MyType1接口的键,修改后出现错误:cannot be assigned to the mutable type '(keyof MyType1)[]'。
错误原因
(keyof MyType1)[]是可变数组类型,而as const会将数组转换为只读的字面量元组类型,两者类型不匹配,导致TypeScript报错。
解决方案
方案1:将数组类型改为只读数组
把显式类型标注为readonly (keyof MyType1)[],兼容as const生成的只读元组:
export interface MyType1 { propName1: number; propName2: string; propNameX: number; } export const tableColumns: readonly (keyof MyType1)[] = [ 'propName1', 'propName2', 'propNameX' ] as const; export type tableColumns = (typeof tableColumns)[number];
方案2:使用satisfies关键字(TypeScript 4.9+推荐)
satisfies可以在保留as const推导的精确字面量类型的同时,约束数组元素必须是MyType1的键,写法更优雅:
export interface MyType1 { propName1: number; propName2: string; propNameX: number; } export const tableColumns = [ 'propName1', 'propName2', 'propNameX' ] as const satisfies readonly (keyof MyType1)[]; export type tableColumns = (typeof tableColumns)[number];
该方案不会改变tableColumns的推导类型,仅验证元素是否符合接口键要求,同时保留了as const带来的精确字面量联合类型。
内容的提问来源于stack exchange,提问作者Sergino
相关产品推荐
相关产品推荐

