Обход TS1337 для валидаторов пользовательских форм в angular TS версии 3.8 - PullRequest
0 голосов
/ 05 августа 2020

Я пишу свои собственные валидаторы пользовательских форм для 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 Ответ

1 голос
/ 05 августа 2020

Вы можете использовать литеральные типы вместо перечислений.

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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...