Свойство 'on' не существует для типа 'FluentRules <любой, любой> | FluentEnsure <any>| FluentRuleCustomizer <любой, любой> '. - PullRequest
0 голосов
/ 24 апреля 2018

Я пишу aurelia-validation и у меня проблема с использованием on, который является частью другого класса перегрузки (FluentRuleCustomizer). Когда я использую ruleBuilder['on'](field);, он работает нормально, но когда я изменяю это на ruleBuilder.on(field);, я получаю красную волнистую линию на ruleBuilder.on(field);. Смотрите приведенный ниже код и скриншот.

import { ValidationRules, FluentRuleCustomizer, FluentEnsure, FluentRules } from 'aurelia-validation';
import { on } from 'cluster';
export class FormHelper {
  private static initializedForms = [];

  public static initializeFormRules(form) {
    if (this.initializedForms.indexOf(form) > -1) {
      return;
    }
    this.initializedForms.push(form);
    for (const field of form.fields) {
      if (field.validation.isValidate) {
        let ruleBuilder: | FluentRules<any, any> | FluentEnsure<any> | FluentRuleCustomizer<any, any>;
        ruleBuilder = ValidationRules
          .ensure("value")
          .displayName(field.label);

        const rules = Object.keys(field.validation.validationRule)
          .map(key => ({ key, value: field.validation.validationRule[key] }));

        for (const rule of rules) {
          ruleBuilder = ruleBuilder[rule.key](rule.value);
        }
//         ruleBuilder['on'](field);
        ruleBuilder.on(field);
      }
    }
  }
} 

Ссылка на все экспортированные классы, доступные для aurelia-validation

Любая помощь очень ценится:)

enter image description here

1 Ответ

0 голосов
/ 25 апреля 2018

Печатные символы / api aurelia-validation не идеальны для динамического построения правил, подобных этому, поэтому вам нужно немного обмануть.

Просто измените свою первоначальную декларацию на:

let ruleBuilder: FluentRuleCustomizer<any, any> = ValidationRules
      .ensure("value")
      .displayName(field.label) as any;

Это на самом деле не будет FluentRuleCustomizer там (следовательно, as any необходим), но это будет после того, как ваша логика ниже применила к нему какие-либо правила. Я думаю, .displayName() должен просто вернуть FluentEnsure или FluentRuleCustomizer (оба имеют метод .on(), который делает то же самое), но это другое обсуждение.

Вы, вероятно, хотите проверить, действительно ли были применены какие-либо правила, иначе .on() выдаст ошибку:

if (rules.length) {
    ruleBuilder.on(field);
}
...