【问题标题】:Aurelia ValidationRules.ensure using TypeScriptAurelia ValidationRules.ensure 使用 TypeScript
【发布时间】:2019-02-14 04:11:57
【问题描述】:

我有一个使用 ES6 和 Babel 创建的 Aurelia 项目,我正在尝试将其转换为 TypeScript。

在一个代码领域,我有这样的事情:

tenant.js

import {ValidationRules} from 'aurelia-validation'
export class Tenant{
    constructor(tenantObject){
        Object.assign(this, tenantObject);
    }
} 

ValidationRules
  .ensure(o => o.name).displayName("Tenant Name").required()
  ...
  .on(Tenant);

system.js(虚拟机)

import {ValidationController} from 'aurelia-validation'
import {NewInstance} from 'aurelia-framework'
import {Tenant} from '../models/tenant'
import {BootstrapValidationRenderer} from 'elements/bootstrap-validation-renderer'

export class System{
    static inject = [DataService, NewInstance.of(ValidationController)]
    constructor(dataService, validationController){
       this.dataService = dataService
       this.validationController = validationController

       this.validationController.addRenderer(new BootstrapValidationRenderer())
    }

    async activate() {
       let data = await this.dataService.getTenant(1);
       this.tenant = new Tenant(data);
    }

    ...
}

system.html

...
<div class="form-group name" >
   <label for="pName" class="form-control-sm">Tenant Name</label>
   <input id="pName" type="text" autofocus class="form-control form-control-sm" value.bind="tenant.name & validate" />
</div>

但是,我现在在tenant.ts 中收到一个错误,指出property 'name' does not exist on type {}

我尝试将name 属性添加到Tenant,但这似乎没有帮助。

有没有办法解决这个问题?

【问题讨论】:

    标签: typescript aurelia


    【解决方案1】:

    似乎aurelia-validation does not 有打字。因此,您必须断言以下类型:

    ValidationRules
      .ensure((o: Tenant) => o.name).displayName("Tenant Name").required()
      ...
      .on(Tenant);
    

    但在此之前,您应该将name 属性添加到Tenant 类:

    export class Tenant{
        public name: string = ''
    
        constructor(tenantObject){
            Object.assign(this, tenantObject);
        }
    } 
    

    附: fwiw 即使aurelia-validation 有类型,你仍然需要断言类型,因为它在方法链的最后接受类名。

    【讨论】:

    • 有没有办法避免必须将所有属性添加到租户类?在我的例子中,后端 API 已经有一个包含所有属性的租户类定义,并且对 DataService 的调用返回该类的 JSON 表示。我希望不必在前端重新定义该类。这可能吗?
    • 那么您将失去使用 TS 的好处。但是是的,只需将这个索引签名添加到类Tenant[key: string]: any
    • 如果您的后端有定义,请使用 NSwag 或您的客户端环境实用程序为客户端生成 DTO 作为 Typescript 类或 Typescript 定义。例如,如果您在主机上有 Swagger,您可以使用 NSwagStudio 之类的东西直接生成 Aurelia Typescript API。如果您使用 ServiceStack,您可以安装 @servicestack/cli 库并使用 typescript-ref 自动生成包含所有 DTO 对象的 dto.ts 文件。尝试找到一种方法来自动生成这种东西,否则你永远无法确定你的客户端/服务器定义是同步的
    • Aurelia 验证确实有类型。查看插件中的bundled aurelia-validation.d.ts文件。
    • @Juliën 好吧,好吧。但是,如果我是正确的,那么这个事实在这种情况下无论如何都没有帮助? “因为它在方法链的最后接受类名”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2017-01-20
    • 2019-07-01
    • 2017-04-29
    • 1970-01-01
    • 2023-03-02
    • 2017-05-28
    相关资源
    最近更新 更多