Статический метод модели Sailsjs

Я пытаюсь создать определение типа для интерфейса модели Sails.js. Sails.js позволяет вам определить простой файл, который экспортирует объект с вложенным объектом «атрибуты». Каждый атрибут соответствует имени столбца в базе данных и типу столбца.

//MyModel.js
module.exports = {

  attributes:{
     name:"string"
  }

}; 

Чтобы использовать эту модель в своем коде, вы пишете такой код:

MyModel.create({name:"alex"}).then(function(result){
   //the model was inserted into the DB, result is the created record.
});

Код, который я написал, выглядит так:

declare module Sails{

  export interface Model{
    create(params:Object):Promise<Sails.Model>;
  }
}

class Model implements Sails.Model{

  create(params:Object):Promise<Sails.Model> {
    return undefined;
  }

  attributes:Object;

  constructor(attributes:Object){
    this.attributes = attributes;
  }


}

class MyModel extends Model{
    constructor(attributes:Object){
        super(attributes);
     }
}

var _export = new MyModel({name:string});

export = _export;

Вот у меня проблема. Для того, чтобы паруса правильно взаимодействовали с моим машинописным кодом, module.exports должен иметь этот объект атрибутов с определениями типа базы данных. Это не было бы проблемой, за исключением случаев, когда я пытаюсь использовать этот класс, ему нужны статические методы, такие как create, которых там нет.

Я хотел бы иметь возможность написать свой машинописный код, используя модель следующим образом:

MyModel.create({name:"bob"}).then((result:MyModel) => {
   //do stuff with result
});

person aclave1    schedule 20.03.2015    source источник


Ответы (1)


Я решил это, но это не красиво:

//api/models/MyModel.ts
import Model = require('./Model');

var MyModel = new Model({
  name:"string"
});

export = MyModel;


//api/model/Model.ts
class Model {

  attributes:Object;
  constructor(attributes:Object){
    this.attributes = attributes;
  }

}
export = Model;


//api/types/MyModelQuery.ts
//this file maps to the attributes of a query result

declare class ScreenQuery {
  name:string;
}
export = ScreenQuery;


//sails.d.ts

declare module Sails{

  export interface Model{
    create(params:Object):Promise<Sails.QueryResult>;
    attributes:Object;
  }

  export interface QueryResult{

  }

  export interface Controller{

  }

}

Я все еще работаю над этим, я обновлю это, как только закончу полную реализацию.

Изменить: я создал сообщение в блоге, полностью описывающее подход, который я использовал. Использование машинописного текста с парусами.js

person aclave1    schedule 20.03.2015