Ionic 2 Angular 2 全局导入扩展方法

joh*_*y 5 4 javascript typescript ionic2 angular

我对 Date 原型进行了一些扩展,例如:

interface Date {
    YearsFromToday(): number;
}

Date.prototype.YearsFromToday = function (): number {
    // implementation 
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 ionic2 教程 --v2 模板,这是一个非常标准的布局 - app.html、app.ts、app.module 等。

我想知道是否有一种简单的方法可以在全球范围内声明。我不确定在项目中的确切位置?

Alu*_*dad 5

将您的猴子补丁代码放在一个文件中。你可以称它为monkey-patch-date.ts,例如:

猴子补丁date.ts

interface Date {
    YearsFromToday(): number;
}

Date.prototype.yearsFromToday = function (): number {
    // implementation 
}
Run Code Online (Sandbox Code Playgroud)

然后将其导入main.ts或任何您的入口模块:

主文件

import './monkey-patch-date';
Run Code Online (Sandbox Code Playgroud)

交替。如果您想更加明确地指出您正在做一些危险的事情,您可以将其设为一个导出其猴子补丁程序的模块。

猴子补丁date.ts

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

export default function () {
    Date.prototype.yearsFromToday = function (): number {
        // implementation 
    };
}
Run Code Online (Sandbox Code Playgroud)

并像这样导入

主文件

import monkeyPatchDate from './monkey-patch-date';
monkeyPatchDate();
Run Code Online (Sandbox Code Playgroud)

另一种对库作者特别有用的替代方法是允许猴子修补但不需要它同时仍然公开功能。

下面是一个例子:

日期增强/index.ts

export function yearsFromToday(date: Date): number {
    // implementation 
}
Run Code Online (Sandbox Code Playgroud)

日期增强/monkey-patch.ts

import {yearsFromToday} from './index';

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

Date.prototype.yearsFromToday = function() {
    return yearsFromToday(this);
}
Run Code Online (Sandbox Code Playgroud)

现在消费者可以通过运行猴子修补日期原型

import 'date-augmentations/monkey-patch';
Run Code Online (Sandbox Code Playgroud)

可以通过导出访问功能而无需猴子修补任何东西

import {yearsFromToday} from 'date-augmentations';

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