如何从JSON文件生成动态字符串数组的TypeScript类型?
解决方案
1. 配置TypeScript编译选项
确保tsconfig.json中开启JSON模块解析,让TypeScript能正确处理JSON文件的类型推断:
{ "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, "strict": true // 可选,开启后能获得更严格的类型校验 } }
2. 导入并锁定JSON类型
先导入JSON文件,再通过as const断言将其转为只读字面量类型,让TypeScript精确识别每个PrivilegeKey的具体值:
// 导入JSON文件 import rawPrivileges from './privileges.json'; // 转为只读字面量类型,固定每个PrivilegeKey的取值 const privileges = rawPrivileges as const;
3. 定义目标类型
先提取单个权限的字面量类型,再通过递归模板字面量类型生成所有允许的|分隔组合:
// 提取单个权限的字面量类型 type SinglePrivilege = typeof privileges[number]['PrivilegeKey']; // 生成所有合法权限组合(单个权限,或多个权限用|连接) type Privilege = SinglePrivilege | `${SinglePrivilege}|${Privilege}`;
4. 使用示例
现在可以按需求使用类型,TypeScript会自动校验值的合法性:
// 合法:单个权限 const test1: Privilege = 'view.test'; // 合法:多个权限用|连接 const test2: Privilege = 'view.test|view.test1'; // 非法:不存在的权限,TypeScript会抛出错误 const test3: Privilege = 'view.invalid';
关于as const的错误原因
你之前直接给JSON导入语句加as const会报错,因为JSON模块本身不能直接用const断言,必须先将导入内容赋值给变量,再对变量做断言才能锁定字面量类型。
内容的提问来源于stack exchange,提问作者Tiaan
相关产品推荐
相关产品推荐

