首页 > 解决方案 > 如何在扩展 JavaScript 原型的 TypeScript 文件中导入库

问题描述

使用这个问题中描述的技术,我正在尝试使用 Moment.js 来扩展DateTypeScript 项目中的原型。

扩展Date原型作品,如下所述:

interface Date {
    myExtension: () => string;
}

if (!Date.prototype.myExtension) {
    Date.prototype.myExtension = function(): string {
        return 'some value derived from a date';
    };
}

但是,只要我导入 Moment.js,通过将以下行添加到我的文件中,TypeScript 就会使我的代码无效,并告诉我Property 'myExtension' does not exist on type 'Date'.

import * as moment from 'moment';

我应该以另一种方式声明 Moment.js 导入吗?

标签: typescriptimportmomentjsprototype

解决方案


不确定,这moment与您的问题有什么关系-我在这里假设您想将全局类型添加到Date.prototype,这将由moment.

您可以通过在自己的文件中定义类型 1.) 或在现有文件模块之一中定义类型 2.)来扩充内置类型的全局类型定义Date.d.ts

1.全局声明文件

创建global.d.ts(命名无关紧要)。将Date接口放入其中,该接口将来自lib.d.ts. 确保您没有任何顶级exportimport声明来将类型附加到全局命名空间/范围。global.d.ts将自动包含在带有tsconfig.json.

// global.d.ts:
interface Date {
  myExtension: () => string;
}

2.文件模块

使用以下命令将定义包装在全局上下文中declare global

// inside some file module with export/import
...
declare global {
  interface Date {
    myExtension: () => string;
  }
}

在 App.ts 中测试

// use moment for implementation
import * as moment from "moment"; 

if (!Date.prototype.myExtension) {
  Date.prototype.myExtension = function(): string {
    return "some value derived from a date";
  };
}

const d = new Date();
console.log(d.myExtension()); // some value derived from a date

推荐阅读