如何使用TypeScript对使用Moment的.js文件进行类型检查?

时间:2019-07-30 03:29:28

标签: typescript momentjs

我有一个使用Moment的小.js文件,该文件旨在直接在要使用TypeScript编译器进行类型检查的浏览器中运行:

document.querySelector("body").textContent = moment().toString();

如果我尝试使用tsc进行类型检查,则编译器会抱怨即使我安装了moment npm软件包,也找不到moment的声明:

$ npm install typescript moment
$ node_modules/.bin/tsc --allowJs --checkJs --noEmit index.js
index.js:1:46 - error TS2304: Cannot find name 'moment'.

1 document.querySelector("body").textContent = moment().toString();
                                               ~~~~~~
Found 1 error.

如何告诉TypeScript编译器自动检测moment全局对象或将其显式导入JS文件中?

3 个答案:

答案 0 :(得分:1)

暂时<= 2.24.0

使用以下内容创建文件moment.shims.d.ts

import moment from '../../node_modules/moment/moment';

export = moment;

export as namespace moment;

(更改导入行以指向您在node_modules中安装的moment的版本。)

与其他TypeScript项目一起编译此shims文件。

您可能需要在esModuleInterop或对tsconfig.json的呼叫中启用tsc --esModuleInterop true选项:

{
    ...
    "compilerOptions": {
        ...
        "esModuleInterop": true,  // needed by: moment.shims.d.ts
    },
}

暂时> 2.24.0

接受this PR后,无需采取特殊措施。

答案 1 :(得分:0)

您如何导入s = input() res = '' for i in range(1,len(s),2): res +=s[i] print(res) 软件包?

使用require / CommonJS语法在这里没有出现任何错误:

moment

使用// index.js const moment = require("moment") document.querySelector("body").textContent = moment().toString(); 进行测试不会给我带来任何错误。

现在,如果您想使用ES6语法,您可以这样做:

tsc --allowJs --checkJs --noEmit src/index.js

并在tsconfig.json文件的// index.js import moment from 'moment' document.querySelector("body").textContent = moment().toString(); 下添加"esModuleInterop": true

答案 2 :(得分:0)

如果它在全球范围内可用,则可以使用:

declare var moment:any

这告诉打字稿该时刻在其他地方声明,并且不应引发错误。

如果您想要更强类型的代码,也可以指定类型而不是any