TypeScript函数:根据第一个参数值约束第二个参数类型
解决TypeScript函数参数类型关联问题
要实现category参数的值约束report参数的类型,你可以通过泛型+映射类型的方式来实现,这样能让TypeScript自动根据传入的category推断出合法的report选项,避免不匹配的情况。
步骤1:创建类别与报告类型的映射
先定义一个映射类型,把每个category和对应的report类型绑定起来,方便后续关联:
type reportCategory = 'financial' | 'operational' | 'security' type financialReports = 'financial workspaces' | 'financial datacenter' type operationalReports = 'operational information' | 'operational environment' type securityReports = 'security Accounts' | 'security needing attention' // 核心:建立类别到报告类型的映射 type CategoryToReport = { financial: financialReports; operational: operationalReports; security: securityReports; };
步骤2:改写泛型函数
把openReport改成泛型函数,用泛型参数C约束category的类型,同时让report的类型自动从映射中获取对应的值:
const openReport = async <C extends reportCategory>( category: C, report: CategoryToReport[C] ) => { // 你的函数逻辑 };
验证效果
现在调用函数时,TypeScript会自动进行类型检查:
- 合法调用(类型匹配):
openReport('financial', 'financial workspaces'); // 正常通过 openReport('security', 'security needing attention'); // 正常通过 - 非法调用(类型不匹配):
openReport('financial', 'operational information'); // TypeScript会直接报错
这种方式的好处是后续如果要新增类别或报告类型,只需要修改reportCategory和CategoryToReport两个地方即可,维护成本低,而且类型约束更严格。
另外,你也可以用函数重载的方式实现,但泛型+映射的写法更简洁,扩展性更好:
// 函数重载写法示例 async function openReport(category: 'financial', report: financialReports); async function openReport(category: 'operational', report: operationalReports); async function openReport(category: 'security', report: securityReports); async function openReport( category: reportCategory, report: financialReports | operationalReports | securityReports ) { // 函数逻辑 }
不过这种写法需要为每个类别写一个重载签名,当类别较多时会比较繁琐。
内容的提问来源于stack exchange,提问作者Mayur Kumar
相关产品推荐
相关产品推荐

