javascript - 类型框架关系

标签 javascript typescript waterline

我一直在玩 TypeScript MVC 框架 TypeFramework我正在尝试找出如何在模型之间创建关系。我知道它使用 Waterline ORM 。具有关系的水线模型的示例是:

// A user may have many pet
var User = Waterline.Collection.extend({
  attributes: {
    firstName: 'string',
    lastName: 'string',

    // Add a reference to Pets
    pets: {
      collection: 'pet',
      via: 'owner'
    }
  }
});

// A pet may only belong to a single user
var Pet = Waterline.Collection.extend({
  attributes: {
    breed: 'string',
    type: 'string',
    name: 'string',

    // Add a reference to User
    owner: {
      model: 'user'
    }
  }
});

TypeFramework 模型的示例如下所示:

class User extends TF.Model{
    firstName: string,
    lastName: string
}

TF.Model 的代码是:

class Model {
    public id: number;
    public createdAt: Date;
    public updatedAt: Date;
    static collectionName: string;
    static schema: boolean;
    static adapter: string;
    static attributes: any;
    private static collection;
    public save: <T>(callback: ISingleResultCallback<T>) => void;
    public destroy: <T>(callback: INoResultCallback<T>) => void;
    static save<T>(model: T, callback: ISingleResultCallback<T>): void;
    static destroy<T>(model: T, callback: INoResultCallback<T>): void;
    static all<T>(): DbQueryEnd<T>;
    static where(query: {}): WL.IQuery;
    static get(id: number): DbQueryUnique<any>;
    static first<T>(query: {}): DbQueryUnique<T>;
    static find<T>(): DbQuery<T>;
    static query<T>(query: string): DbQueryRaw<T>;
    static validate(attr: string, options: ModelValidation): any;
    static validate(attrs: string[], definition: ModelValidation): any;
    private static extend(from, to);
}

我不确定如何将关系集成到强类型 TypeFramework 模型中。任何建议或帮助将不胜感激。

最佳答案

所以,让我在不了解这两个框架的所有内部工作原理的情况下做序言。不过,我想我知道如何在这里得到你想要的东西。

首先,如果您同意让模型使用 Typescript,并且您的水线代码使用 Javascript,那么这会让这变得更容易。

但是,如果您想在 Typescript 中使用 Waterline,您可能需要创建 .d.ts 文件。不幸的是,我目前在DefinitelyTyped 上没有看到任何可用的内容。这并不是特别容易,但只要有一定的意志力,您可能就能充分理解这个概念并使其发挥作用。 The official guide is pretty good.

也就是说,开始编写代码!

您需要使用您需要的所有内容来实例化您的类。如果您没有将内容放入类属性中,您很可能会错过它们。您需要使用 super(); 调用基础对象的构造函数;也是如此。

class User extends Model
{
    firstName: string;
    lastName: string;
    pets: IPet[];

    constructor(firstname: string, lastname: string, pets: IPet[])
    {
        super();
        this.firstName = firstname;
        this.lastName = lastname;
        this.pets = pets;
    }
}

interface IPet
{
    breed: string;
    petType: string;
    name: string;
}

您可能想要创建 Pet 和实际类,但目前我们假设它不是。

那么,按照上面描述的方式创建 Waterline User 所需要做的就是这样:

var User = Waterline.Collection.extend(
    new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
);

您可能有一个静态方法,可以获取“预建”类型的用户,或者通过 ID 获取用户。

static GetJimAndPets() : User
{
    return new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
}

static GetUserById(id: number) : User
{
    //Logic here
    return null;
}

然后你可以更轻松地调用你的方法:

var User = Waterline.Collection.extend(User.GetJimAndPets());

这应该可行,但正如我之前提到的,我不知道如何测试它和 YMMV。

关于javascript - 类型框架关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074565/

相关文章:

javascript - Angular - 更新过滤器上的 ngFor 索引

javascript - 如何创建具有重复键的 JSON 对象

sails.js - 如何在 Sails 的 Controller 中自定义创建

javascript - 我们如何将医学图像的片段位置与 JS 中的点击事件位置相关联?

JavaScript 单例模式和 'this'

javascript - 在我的 Angular 2 应用程序中绑定(bind)到正确的服务调用

typescript - 如何从泛型函数中的参数类型推断返回类型?

javascript - Waterline Sails JS 不起作用

javascript - 为什么在使用for命令时将 “Unexpected token )”扔给我?

javascript - 每当我滚动浏览该部分时突出显示我的导航栏菜单项?仅使用 JavaScript