代码之家  ›  专栏  ›  技术社区  ›  Joon

如何在typescript中向导入的库模块添加新的原型方法/属性?

  •  0
  • Joon  · 技术社区  · 6 年前

    我有以下代码:

    import mongoose from 'mongoose';
    
    const { ObjectId } = mongoose.Types;
    
    // adds new getter property to ObjectId's prototype
    Object.defineProperty(ObjectId.prototype, 'hex', {
      get() {
        return this.__id || (this.__id = this.toHexString());
      },
      configurable: true,
      enumerable: false,
    });
    

    如何添加 hex 到typescript中的mongoose.types.objectid类?

    “蒙古人”的类型是通过 @types/mongoose

    1 回复  |  直到 6 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    6 年前

    我们可以使用模块扩充将属性添加到 ObjectId . 在这种情况下,问题是找到 对象ID 实际居住。

    如果我们看看 对象ID 在里面 mongoose.Types 我们发现:

    var ObjectId: ObjectIdConstructor;
    type ObjectIdConstructor = typeof mongodb.ObjectID & {
      (s?: string | number): mongodb.ObjectID;
    };
    

    所以返回类型 new ObjectId() 实际上 mongodb.ObjectID ,让我们看看它的外观:

    export { ObjectID /* … */} from 'bson';
    

    所以,我们找到了 ObjectID 只是转口 'bson' ,如果我们看看 bson 最后我们找到了类定义:

    export class ObjectID { … }
    

    综合起来,我们得到:

    import * as mongoose from 'mongoose';
    
    const { ObjectId } = mongoose.Types;
    
    declare module "bson" {
        export interface ObjectID {
            hex: string
        }
    }
    
    // adds new getter property to ObjectId's prototype
    Object.defineProperty(ObjectId.prototype, 'hex', {
      get() {
        return this.__id || (this.__id = this.toHexString());
      },
      configurable: true,
      enumerable: false,
    });
    
    new ObjectId().hex