typescript - 在 Angular TS 版本 3.8 中绕过 TS1337 以实现自定义表单验证器
我正在为 Angular 编写我自己的自定义表单验证器,使用以下模板。
static customFunction(param: number, param2: string): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } => {
return { customError: {param, param2} };
};
}
我不想使用 key:string,而是只允许来自已定义枚举的一系列项目。
export enum FormErrorEnum {
unknown = 'unknown',
customError = 'customError',
}
export type FormError = keyof typeof FormErrorEnum;
如果我尝试使用 [key: FormError]: any 或 [key in FormError]:any,我将会得到两种错误中的一种。
[key: FormError]: any 会导致 TS1337。[key in FormError]: any 会导致返回值 (customError: {param,param2}) 被拒绝,因为它不包含枚举中的所有项。
我已经看过这个帖子了。TS版本是3.8——升级是一个选项。
答案#1
你可以使用字面量类型而不是枚举。
export type FormError = 'unknown' | 'customError';
const error1: FormError = 'unknown'; // ok
const error2: FormError = 'illegal'; // error
你的 customFunction 的返回类型应该是:
type ErrorResult = {
[P in FormError]?: any;
};
如果你只允许 FormError 的一个属性:
type ErrorResult = {
[P in FormError]: { [K in P]: any };
}[FormError];
其背后的想法是:为每个键创建所需的类型:{ [K in P]: any }。将它们放入一个映射中:{ [P in FormError]: {...} }。获取映射的值:[FormError]
