属性 'on' 在类型 'FluentRules<any, any> | FluentEnsure<any> | FluentRuleCustomizer<any, any>' 上不存在。

Property 'on' does not exist on type 'FluentRules<any, any> | FluentEnsure<any> | FluentRuleCustomizer<any, any>'.

我正在编写 aurelia-validation 并在使用 on 时遇到问题,它是不同重载 (FluentRuleCustomizer) class 的一部分。当我使用 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);
      }
    }
  }
} 

Linkaurelia-validation

公开的所有导出的 classes

非常感谢任何帮助:)

aurelia-validation 的类型/api 不适合动态构建这样的规则,因此您需要作弊。

只需将您的初始声明更改为:

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

它实际上不会是 FluentRuleCustomizer(因此需要 as any),但它会在您的下面的逻辑对其应用任何规则之后出现。老实说,我认为 .displayName() 应该只是 return 一个 FluentEnsureFluentRuleCustomizer(两者都有 .on() 方法做同样的事情)但这是另一个讨论。

您可能需要仔细检查是否实际应用了任何规则,否则 .on() 会出错:

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