0

我正在使用带有 Loopback 3 的 Fireloop,并且想知道如何最好地使用类型检查PersistedModel和方法来创建类型安全挂钩和远程Validatable方法。我想将构造函数的类型从 ...

constructor(public model: any) { }

至 ...

constructor(public model: SomeType) { }

我想进行 PersistedModel 调用,例如

this.model.count().then((n) => ...); 

或可验证的调用,例如:

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

像下面这样的 Fireloop 示例仅用anythis.model. firestarter 模型示例和 Fireloop 文档在这里也没有用。

我知道在core/index.d.tsModelConstructor下的 fireloop 源代码树中声明了一种类型。这个接口看起来是正确的,因为它实现了所有的和方法,但是它在 npmjs 中发布在哪里?它已经是 Fireloop 服务器 SDK 的一部分还是我需要它?不知道。PersistedModelValidatablenpm 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 定义,但遇到了更多问题,因为这里的 PersistedModel 方法都被声明为静态,因此类型检查失败并返回Promise<T> | void。后者意味着您被迫将结果类型强制转换回 just Promise<T>,因此类型 def 作者似乎从未真正使用过它们。这是一个错误还是我错过了什么?找不到任何工作示例来证明其他情况。

这是服务器端 API 的痛点。Fireloop 的客户端 REST API 也没有记录(很多实时 API 的示例),但它也应该包含的 REST api 没有记录(只是在一期中提到过一次)。很高兴发现它都可以通过 Typescript 进行类型检查。

4

1 回答 1

0

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

Loopback 3 类型定义中的类型定义更完整,但除非如上所述进行修复,否则无法使用。

最后我用了..

# 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 => { ... }); 
于 2017-11-16T22:23:58.773 回答