Как использовать проверку типов Loopback / Fireloop PersistedModel
Я использую Fireloop с Loopback 3 и хочу узнать, как лучше всего создать типобезопасные хуки и удаленные методы, используя проверенный тип 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, подобные приведенному ниже, используют только any
как тип this.model
, Образцы моделей Firestarter и документация Fireloop здесь также были бесполезны.
Я знаю, что есть тип под названием ModelConstructor
объявлено в дереве исходного кода fireloop в core / index.d.ts. Этот интерфейс выглядит правильно, потому что он реализует все PersistedModel
а также Validatable
методы, но где это опубликовано в npmjs? Это уже часть SDK сервера Fireloop или мне нужно 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, но столкнулся с большим количеством проблем, так как все методы PersistedModel здесь объявлены как статические, поэтому проваливают проверки типов и возвращают Promise<T> | void
, Последнее означает, что вы вынуждены набрать приведение результата к просто Promise<T>
кажется, что авторы типа def никогда их не использовали. Это ошибка или я что-то упустил? Не могу найти никаких рабочих примеров, чтобы доказать обратное.
Это боль API на стороне сервера. Клиентский REST API для Fireloop также недокументирован (много примеров для API реального времени), но ни один для REST API он также не должен включать (только что упомянутый один раз в одном выпуске). Было бы неплохо найти, что все это может быть проверено типом Typescript.
1 ответ
Я нашел это 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 => { ... });