我正在使用Fireloop和Loopback 3,并想知道如何使用类型检查PersistedModel
和Validatable
方法创建类型安全钩子和远程方法。我想改变构造函数的类型......
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
的类型。此接口看起来正确,因为它实现了所有PersistedModel
和Validatable
方法,但它在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进行类型检查。
答案 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 => { ... });