TypeScript如何限定泛型K的参数为对应类型是FormGroup的成员键
TypeScript 限定方法参数为指定类下类型为FormGroup的成员键实现方案
核心思路是通过自定义映射类型过滤出目标类中所有值类型继承自FormGroup的键,再将参数类型约束为该过滤后的键集合,具体实现如下:
步骤1:定义泛型工具类型
先实现一个通用的泛型工具,用来从指定类型中筛选出所有值类型为FormGroup或继承自FormGroup的键:
import type { FormGroup } from '@angular/forms'; // 泛型工具:提取类型K中所有值类型为FormGroup/继承FormGroup的键 type FormGroupKeys<K> = { [P in keyof K]: K[P] extends FormGroup ? P : never }[keyof K];
步骤2:修改方法的参数类型约束
将原方法中formGroupName的类型替换为上面定义的工具类型即可:
public async myMethod<T, K>( // 其他原有参数 formGroupName: FormGroupKeys<K> ) { // 原有方法逻辑 }
效果验证
假设ComponentB的定义如下:
class ComponentB { // 符合要求的FormGroup类型属性 form: FormGroup; // 自定义的FormGroup子类属性也会被识别 customForm: CustomFormGroup; // CustomFormGroup extends FormGroup // 非FormGroup类型属性 name: string; count: number; }
调用时:
// 合法入参:仅允许传入 'form'、'customForm' this.service.myMethod<ComponentA, ComponentB>( // 其他参数 'form' ); // 传入非FormGroup属性的键会直接报类型错误,例如下方代码会校验不通过 // this.service.myMethod<ComponentA, ComponentB>('name')
原写法问题说明
你之前使用的keyof K & typeof FormGroup逻辑存在偏差:keyof K是K的成员键的联合类型(多为字符串/数字/符号类型),typeof FormGroup是FormGroup构造函数的类型,两类没有交集,实际上没有起到类型过滤的作用。
内容的提问来源于stack exchange,提问作者jo-chris
相关产品推荐
相关产品推荐

