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

时间:2018-07-10 00:37:52

标签: typescript

我有以下代码:

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,
});

如何向打字稿中的mongoose.Types.ObjectId类添加hex

类型的“猫鼬”是通过@types/mongoose

导入的

1 个答案:

答案 0 :(得分:2)

我们可以使用模块扩充来向ObjectId添加属性。在这种情况下,问题在于找到ObjectId实际所在的位置。

如果我们查看mongoose.Typesvar 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

将所有内容放在一起,我们得到:

// Zoom in/out clothing img
  $('.image').click(function() {
    $(this).toggleClass('normal-zoom zoom-in');
  });