如何使用类型检查Loopback / Fireloop PersistedModel

时间:2017-11-10 12:29:21

标签: loopback fireloop

我正在使用Fireloop和Loopback 3,并想知道如何使用类型检查PersistedModelValidatable方法创建类型安全钩子和远程方法。我想改变构造函数的类型......

constructor(public model: any) { }

到...

constructor(public model: SomeType) { }

我想像

那样进行PersistedModel调用
this.model.count().then((n) => ...); 

OR Validatable调用如:

model.validatesLengthOf('code', { 
    min: 6, max: 12, message: { min: 'too short',  max: 'too long'} 
});

Fireloop示例(如下所示)仅使用any作为this.model的类型。 firestarter model samples和Fireloop文档在这里也没用。

我知道在core/index.d.ts下的fireloop源代码树中声明了一个名为ModelConstructor的类型。此接口看起来正确,因为它实现了所有PersistedModelValidatable方法,但它在npmjs中发布了什么?它是否已经成为Fireloop服务器SDK的一部分,还是我需要npm install它?不知道。

import { Model } from '@mean-expert/model';

/**
 * @module Account
 * @description
 * Write a useful Account Model description.
 * Register hooks and remote methods within the
 * Model Decorator
 **/
@Model({
  hooks: {
    beforeSave: { name: 'before save', type: 'operation' }
  },
  remotes: {
    myRemote: {
      returns: { arg: 'result', type: 'array' },
      http: { path: '/my-remote', verb: 'get' }
    }
  }
})

class Account {
  // LoopBack model instance is injected in constructor
  constructor(public model: any) { }

  // Example Operation Hook
  beforeSave(ctx: any, next: Function): void {
    console.log('Account: Before Save', ctx.instance);    
    next();
  }
  // Example Remote Method
  myRemote(next: Function): void {
    this.model.find(next);
  }
}

module.exports = Account;

最后,我还尝试使用Loopback 3 Typescript definitions但遇到了更多问题,因为此处的PersistedModel方法都声明为静态,因此失败类型检查并返回Promise<T> | void。后者意味着你被迫将结果类型转换回Promise<T>,所以看起来def类型的作者从未真正使用它们。这是一个错误还是我错过了什么?找不到任何工作实例证明不是。

这是服务器端API的痛苦。 Fireloop的客户端REST API也没有文档记录(很多实时API的例子)但是REST API也没有包含它(在一个问题中只提到过一次)。很高兴发现它可以通过Typescript进行类型检查。

1 个答案:

答案 0 :(得分:0)

我发现ModelConstructor验证方法缺少{ message: 'my error message' }等参数,exists()等方法返回Promise<any>而不是Promise<boolean>

Loopback 3 Type definitions中的类型定义更完整,但除非按上述方法修复,否则无法使用。

最后我用了..

# Used modified type defs from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/loopback/index.d.ts

import { Validatable } from '../types/validatable';
 # Fixed static methods and return types.
import { PersistedModel } from '../types/loopback';

constructor(public MyModel: Validatable | PersistedModel) {
  let Model = MyModel as Validatable;
  Model.validatesLengthOf('code', {
    min: 6, 
    max: 80, 
    message: { min: 'too short',  max: 'too long' } });
  Model.validatesFormatOf('email', 
    { with: this.reEmail, 
      message: 'invalid email address', 
      allowNull: false });
  Model.validatesInclusionOf('role', { 
    in: RoleNames, 
    message: 'is not valid' 
  });
}

以后的方法..

let Model = this.MyModel as PersistedModel;

// knows that isFound is boolean
Model.exists(code).then(isFound => { ... });