Как расширить нативные типы JavaScript в TypeScript 1.8, используя глобальное дополнение?

Я пытаюсь расширить собственные типы JavaScript, используя новую глобальную аугментацию в TypeScript 1.8, как описано здесь. Однако у меня возникают проблемы, когда функции расширения возвращают один и тот же тип.

Global.ts

export {};
declare global {
    interface Date {
        Copy(): Date;
    }
}

if (!Date.prototype.Copy) {
    Date.prototype.Copy = function () {
        return new Date(this.valueOf());
    };
}

DateHelper.ts

export class DateHelper {
    public static CopyDate(date: Date): Date {
        return date.Copy();
    }
}

Я получаю следующую ошибку TS2322 при попытке использовать определенное расширение в DateHelper.ts:

Type 'Date' is not assignable to type 'Date'.
Property 'toDateString' is missing in type 'Date'.

Кто-нибудь знает, как решить эту проблему?


person Michael    schedule 28.04.2016    source источник


Ответы (1)


Вы можете сделать это следующим образом:

Global.ts:

interface Date 
{
    Copy: () => Date;
}

Date.prototype.Copy = function() 
{
    return new Date(this.valueOf());
};

В вашем DateHelper.ts

import './Global';

export class DateHelper {
    public static CopyDate(date: Date): Date {
        return date.Copy();
    }
}
person Amid    schedule 28.04.2016
comment
Спасибо, это действительно сработает, пока вы не сделаете что-то вроде этого: import {Predicate, Selector, Action, Comparer, Dictionary, Group} from PrototypeExtensions; объявить глобальный{ интерфейс Дата { Копировать: () => Дата; } } Date.prototype.Copy = function() { return new Date(this.valueOf()); }; Когда вы делаете это, вам нужно добавить глобальную часть объявления, и это, в свою очередь, дает вам ошибку TS2322. - person Morten Schmidt; 29.04.2016
comment
Спасибо, я буду использовать этот подход, пока мы не найдем решение, использующее глобальное дополнение. - person Michael; 29.04.2016