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

标签 javascript angular typescript ionic2

我对 Date 原型(prototype)做了一些扩展,例如:

interface Date {
    YearsFromToday(): number;
}

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

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

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

最佳答案

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

monkey-patch-date.ts

interface Date {
    YearsFromToday(): number;
}

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

然后将其导入到 ma​​in.ts 或任何您的入口模块:

ma​​in.ts

import './monkey-patch-date';

交替。如果你想更加明确地指出你正在做一些危险的事情,你可以使它成为一个导出其 monkey-patcher 的模块。

monkey-patch-date.ts

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

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

然后导入它

ma​​in.ts

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

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

这是一个例子:

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);
}

现在消费者可以通过运行猴子修补 Date 原型(prototype)

import 'date-augmentations/monkey-patch';

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

import {yearsFromToday} from 'date-augmentations';

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

关于javascript - Ionic 2 Angular 2 全局导入扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43439317/

相关文章:

javascript - 按 "enter"键时停止 VSCode 触发建议

javascript - 如何找出哪个文件包含javascript函数

javascript - 在 JEST 中导出 beforeAll 和 afterAll

angular - Angular 5 中 Angular @angular/http URLSearchParams 类的替代品是什么

typescript - 如何从两个接口(interface)的联合创建一个类型?

html - 从数组 typescript 中删除对象(Angular 2)

typescript - 在 typescript 中定义 lambda 函数的问题

javascript - 如何给滑动的div设置scrolltop()方法?

Angular `<router-outlet>` 显示模板两次

angular - Firebase Extensions Resize Images with AngularFire 后如何获取新的下载 URL?