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
