TypeScript: добавить функцию в прототип momentjs

Я пытаюсь добавить функцию к прототипу momentjs. В Javascript код был таким:

Object.getPrototypeOf(moment()).isWeekend = function() {
    return this.isoWeekday() >= 6;
};

Как мне сделать это в машинописном тексте? Я читал, что мне нужно продублировать интерфейс и мою функцию, но это не работает:

module moment {
    interface Moment {
        isWeekend(): boolean
    }

    Moment.prototype.isWeekend = () => {
        this.isoWeekday() >= 6;
    };
}

person Bart van den Burg    schedule 30.07.2015    source источник


Ответы (2)


Вам нужно разместить фактическое расширение вне модуля, и вам нужно экспортировать интерфейс ...

module moment {
    export interface Moment {
        isWeekend(): boolean
    }
}

(<any>moment).fn.isWeekend = function() {
    this.isoWeekday() >= 6;
};
person Fenton    schedule 30.07.2015
comment
Я пытался применить это, но у меня появляется момент. IsWeekend не определен, когда я пытаюсь его использовать - person Bart van den Burg; 31.07.2015
comment
Похоже, что с MomentJS вы не расширяете прототип, а вместо этого добавляете свойство fn. Я обновил пример. Вам также необходимо использовать функцию, а не функцию стрелки, иначе вы повлияете на область действия this. - person Fenton; 31.07.2015
comment
Моя ошибка заключалась в том, что мне не нужно было изменять исходный код JavaScript, а просто добавить объявление TypeScript. - person Bart van den Burg; 22.12.2015
comment
@Fenton Я получаю сообщение об ошибке: [ts] не может использовать пространство имен «момент» в качестве значения. - person Rookian; 30.06.2017

У меня это работает.

import * as moment from 'moment';
declare module 'moment' {
  export interface Moment {
    toTaiwaneseYear(): number;
  }
}

(moment.fn as any).toTaiwaneseYear = function () {
  const _self = this as moment.Moment;
  return _self.year() - 1911;
}

ссылка:

https://medium.com/my-life/extension-method-in-typescript-66d801488589

person Bibby Chung    schedule 30.01.2018