javascript - Ionic 2 Angular 2 Metode de extensie Import Global


Am făcut câteva extensii la prototipul Date, cum ar fi:

interface Date {
    YearsFromToday(): number;
}

Date.prototype.YearsFromToday = function (): number {
    // implementation 
}

Folosesc tutorialul ionic2 --v2 template, care este un layout destul de standard - app.html, app.ts, app.module etc.

Mă întrebam dacă există o metodă ușoară de a declara asta la nivel global. Nu sunt sigur exact unde să pun asta în proiect?

Răspuns #1

Puneți codul dvs. de monkey patch într-un fișier. Ați putea să-l numiți monkey-patch-date.ts, de exemplu:

monkey-patch-date.ts

interface Date {
    YearsFromToday(): number;
}

Date.prototype.yearsFromToday = function (): number {
    // implementation 
}

și apoi importă-l în main.ts sau orice modul de intrare ai avea:

main.ts

import './monkey-patch-date';

Alternativ. Poți să faci din el un modul care exportă monkey-patcher-ul său dacă vrei să fii foarte explicit pentru a sublinia că faci ceva periculos.

monkey-patch-date.ts

declare global {
    interface Date {
        yearsFromToday(): number;
    }
}

export default function () {
    Date.prototype.yearsFromToday = function (): number {
        // implementation 
    };
}

Și importă-l ca

main.ts

import monkeyPatchDate from './monkey-patch-date';
monkeyPatchDate();

O altă alternativă, deosebit de utilă pentru autorii de biblioteci, este să permită monkey-patching, dar să nu îl impună, expunând în același timp funcționalitatea.

Iată un exemplu:

date-augmentations/index.ts

export function yearsFromToday(date: Date): number {
    // implementation 
}

date-augmentations/monkey-patch.ts

import {yearsFromToday} from './index';

declare global {
    interface Date {
        yearsFromToday(): number;
    }
}

Date.prototype.yearsFromToday = function() {
    return yearsFromToday(this);
}

Acum, un consumator poate fie să modifice prototipul Date prin rularea

import 'date-augmentations/monkey-patch';

Poate accesa funcționalitatea prin export fără a modifica nimic prin monkey patching

import {yearsFromToday} from 'date-augmentations';

const date = new Date('12-12-2023');
const yft = yearsFromToday(date);
console.log(yft); // prints 6