如何在TypeScript中从数组创建对应的Type类型?
实现数组到TypeScript联合类型的转换
你可以通过TypeScript的const断言和类型查询来实现,无需重复编写字符串字面量,具体步骤如下:
1. 修改constants.ts,固定数组类型
在定义validFields时添加as const,让TypeScript将数组推断为只读的字面量元组,而非宽泛的string[]:
const validFields = ['ID_PRODUCT', 'PRICE'] as const; // 基于validFields自动生成联合类型 type Columns = typeof validFields[number];
这里typeof validFields会获取元组的类型readonly ["ID_PRODUCT", "PRICE"],[number]索引访问会提取元组中所有元素的类型,最终生成'ID_PRODUCT' | 'PRICE'的联合类型。
2. modeling.ts中使用自动生成的类型
直接引用上面生成的Columns类型即可:
import { Columns } from './constants'; function getBy(query: { column: Columns, value: string | number }) { // 函数实现 }
注:你示例中consumer.ts传入的value是数字123,这里将value类型调整为string | number更贴合实际场景,可根据需求自行修改。
3. consumer.ts中的类型校验
此时调用getBy时,column参数会自动校验是否属于validFields中的值,传入非法值会触发TypeScript报错:
import { getBy } from './modeling'; // 合法:符合validFields中的值 const product = getBy({ column: 'ID_PRODUCT', value: 123 }); // 非法:TypeScript会报错,因为'INVALID_FIELD'不在validFields中 // const invalidProduct = getBy({ column: 'INVALID_FIELD', value: 'abc' });
这种方式既保证了数组和类型的一致性,又避免了重复编写代码,完全通过TypeScript类型系统实现。
内容的提问来源于stack exchange,提问作者rb_engineer
相关产品推荐
相关产品推荐

