为什么我不能捕获Angular的FormGroup构造函数的参数类型?

时间:2019-03-05 00:09:30

标签: angular typescript

我正在尝试创建一个类型正确的包装函数,该函数最终将调用new FormGroup(),并且我想不通过复制粘贴签名就将参数传递给它。

TypeScript但是抱怨FormGroup类类型不能用作TS的ConstructorParameters的类型参数:

  

类型FormGroup不满足约束new (...args: any[]) => any
  类型FormGroup与签名new (...args: any[]): any不匹配。

这可以通过从角度.d.ts中摘录来复制:

declare interface AbstractControl { }
declare interface ValidatorFn { }
declare interface AbstractControlOptions { }
declare interface AsyncValidatorFn { }

declare class FormGroup {
    constructor(
        controls: {[key: string]: AbstractControl}, 
        validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, 
        asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null
    );
}

type FormGroupParams = ConstructorParameters<FormGroup>; // <= Error occurs here

有什么作用?为什么用class声明为constructor的东西对TS来说不是新的?有什么方法可以访问此签名?

1 个答案:

答案 0 :(得分:2)

ConstructorParameters<T>所隐含的类型签名(即new (...args: any[]) => any的存在)仅针对该类的实例部分进行检查。但是,构造函数是类的静态部分的一部分。类型检查器看不到构造函数的存在,因此给您类型错误。 See the docs on this

您需要的 是从静态端提取到实例部分的一种方法,因为以下功能可以按预期工作:

declare interface FormGroupConstructor {
    new (
        controls: {[key: string]: AbstractControl}, 
        validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, 
        asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null
    ): FormGroup;
}

type FormGroupParams = ConstructorParameters<FormGroupConstructor>

我在这里声明的接口是构造函数的类型。换句话说,您要访问构造函数的类型ConstructorParameters。所以,而不是

type FormGroupParams = ConstructorParameters<FormGroup>

你会做

type FormGroupParams = ConstructorParameters<typeof FormGroup>