我有一个使用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文件中?
答案 0 :(得分:1)
使用以下内容创建文件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
},
}
接受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