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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:19