【问题标题】:Typescript/Loopback Related ModelsTypescript/Loopback 相关模型
【发布时间】:2017-09-18 12:38:12
【问题描述】:

我正在尝试定义相关模型,例如@types/loopback definitions 中的HasMany 关系

我已经为 HasMany 定义了一个接口,因为它已实现:

  interface IHasMany {
        /**
         * Create a target model instance
         * @param {Object} targetModelData The target model data
         * @param {Function} callback The callback function
         */
        // HasMany.prototype.create = function(targetModelData, options, cb)
        create<T = any>(targetModelData: any, callback?: (err: Error, instance: T) => void): Promise<T> | void;

(snip ... other functions findById, exists, updateById, destroyById omitted for bevity)

角色模型具有以下内置关系(在 loopback 模块中定义):

"relations": {
    "principals": {
        "type": "hasMany",
        "model": "RoleMapping",
        "foreignKey": "roleId"
    }
}

在 Typescript 中,这个函数的用法如下:

await createdRole.principals.create({
    principalType: loopback.RoleMapping.USER, 
    principalId: createdUser.id
});

(注意:loopback.RoleMapping.USER 是即将提交给 DT 的 PR 中的常量)

所以现在,我需要将此接口附加到 Role 模型,并让它引用 RoleMapping 模型。

  class Role extends PersistedModel {
        static OWNER: string;
        static RELATED: string;
        static AUTHENTICATED: string;
        static UNAUTHENTICATED: string;
        static EVERYONE: string;

        /** HasMany RoleMappings */
        static async principals = ????

对后续步骤有任何指导吗?似乎我需要将 IHasMany 扩展为特定于角色映射(例如 IHaveManyRoleMappings)——可能使用this post,然后让主体类似于:

static async principals = class RoleMappings implements IHasManyRoleMappings {};

【问题讨论】:

    标签: typescript loopbackjs typescript-typings


    【解决方案1】:

    好的,对于遇到此问题的其他人,这里是关键:

    在接口中,用这个&lt;T&gt;做一个通用接口:

      interface HasMany<T> {
            /**
             * Find a related item by foreign key
             * @param {*} id The foreign key
             * @param {Object} [options] Options
             * @param {instanceCallback} callback
             */
            // HasMany.prototype.findById = function(fkId, options, cb)
            findById<T = any>(id: any, options?: any, callback?: (err: Error, instance: T) => void): Promise<T> | void;
    (snip ... other functions findById, exists, updateById, destroyById omitted for bevity)
    

    接下来,您只需将其包含在您的接口/类中,如下所示:

      class Role extends PersistedModel {
            static OWNER: string;
            static RELATED: string;
            static AUTHENTICATED: string;
            static UNAUTHENTICATED: string;
            static EVERYONE: string;
    
            /** HasMany RoleMappings */
            //  createdRole.principals.create({principalType: loopback.RoleMapping.USER, principalId: createdUser.id});
            principals: HasMany<RoleMapping>;
    

    现在很容易使用如下:

    await createdRole.principals.create({ 
        principalType: loopback.RoleMapping.USER, 
        principalId: createdUser.id
    })
    

    【讨论】:

    • 这真是太棒了。我正在定义每个类的获取、查找、计数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2016-01-16
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多