如何在TypeScript中获取Policy联合类型包含的接口列表
自动提取TypeScript联合类型成员列表(适配自动更新的Proto生成文件)
你需要从自动生成的Proto TypeScript文件中提取Policy联合类型包含的所有接口名称,且要应对文件后续自动新增成员的情况,以下是几种可行方案:
方案1:构建时脚本自动提取(推荐)
编写Node.js脚本,读取目标文件并通过正则匹配提取联合类型成员,可集成到构建流程中自动执行:
const fs = require('fs'); const path = require('path'); // 替换为你的Proto生成文件路径 const filePath = path.resolve(__dirname, './generated-policy.ts'); const content = fs.readFileSync(filePath, 'utf8'); // 匹配Policy联合类型定义 const policyUnionRegex = /export type Policy\s*=\s*([\s\S]*?);/; const matchResult = content.match(policyUnionRegex); if (matchResult) { // 提取并清理成员列表 const policyMembers = matchResult[1] .split('|') .map(item => item.trim()) .filter(Boolean); const result = JSON.stringify(policyMembers); console.log(result); // 可将结果写入文件供后续使用 fs.writeFileSync(path.resolve(__dirname, './policy-members.json'), result); } else { console.error('未找到Policy联合类型定义'); }
将脚本加入项目的npm scripts(例如"extract-policy": "node extract-policy.js"),每次Proto文件更新后运行脚本,即可自动得到最新的成员数组。
方案2:类型约束下的运行时映射
利用TypeScript的类型约束,在代码中维护一份与联合类型同步的成员数组,新增成员时会触发编译错误提醒更新:
// 导入生成文件中的类型 import type { Policy } from './generated-policy'; // 定义成员数组,通过类型约束确保与联合类型匹配 export const POLICY_MEMBERS = ['UserPolicy', 'BrandPolicy', 'OrganizationPolicy'] as const; // 类型断言:如果数组与联合类型不一致,编译会报错 type PolicyMember = typeof POLICY_MEMBERS[number]; type _AssertMatch = Policy extends { type: `${Uppercase<PolicyMember>}_POLICY` } ? true : false; const _assert: _AssertMatch = true;
这种方式无需额外脚本,新增成员时编译错误会强制你更新数组,适合轻量场景。
临时手动提取(一次性需求)
如果仅需临时获取,直接从export type Policy的定义中复制各接口名称,整理为如下数组即可:
['UserPolicy', 'BrandPolicy', 'OrganizationPolicy']
内容的提问来源于stack exchange,提问作者Roee Gavirel
相关产品推荐
相关产品推荐

