TypeScript如何将函数参数类型限制为指定对象的属性取值
TypeScript 限制函数参数为指定对象属性值的实现方法
步骤1:固定input对象的字面量类型
首先需要给input对象添加as const断言,避免TypeScript将内部的字符串属性值自动拓宽为通用string类型,导致后续类型约束失效:
export const input = { a: { ROLE_a: 'xxx' }, b: { ROLE_b: 'xxx' }, c: { ROLE_c: 'xxx' } } as const;
步骤2:提取允许的参数值类型
从input的类型中提取所有二级属性的值,组成联合类型作为参数的合法类型:
// 提取input所有一级键的联合:'a'|'b'|'c' type InputRootKey = keyof typeof input; // 提取所有二级属性的值的联合,就是我们需要的合法参数类型 type AllowedParam = typeof input[InputRootKey][keyof typeof input[InputRootKey]];
步骤3:给函数参数添加类型约束
直接将上面定义的AllowedParam作为参数类型即可:
export const doSomething = (param: AllowedParam) => {}; // 测试效果 doSomething("dwdew"); // 类型报错:字符串"dwdew"不属于AllowedParam联合类型 doSomething(input.a.ROLE_a) // 类型校验通过
补充说明
如果你的业务场景中各个二级ROLE的值是不同的,该约束会自动识别所有合法值;如果所有ROLE值都相同,那么参数会被限制为只能传入该固定值。
内容的提问来源于stack exchange,提问作者sshmaxime
相关产品推荐
相关产品推荐

