我正在尝试创建一个类型正确的包装函数,该函数最终将调用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来说不是新的?有什么方法可以访问此签名?
答案 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>