使用RequireJs,TypeScript转换到AMD模块。不使用NPM。我有' allowSyntheticDefaultImports'设置为true。
我在从官方仓库复制的libs文件夹中有moment.js v2.17.1,并且已经使用RequireJS正确设置了它,并且在运行时它运行正常,所以这只是一个TypeScript编译错误。
TS2304: Cannot find name 'moment'
我在我的打字文件夹中的官方报告中有一点时间。
import "moment";
给出了同样的错误。
import moment = require("moment");
给出TS2307: Cannot find module 'moment'.
任何想法?
编辑:tsconfig.json看起来像
{
"compileOnSave": true,
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"module": "amd",
"noImplicitAny": false,
"removeComments": false,
"preserveConstEnums": true,
"sourceMap": true,
"noEmitOnError": false
},
"include": [
"**/*"
],
"exclude": [
"node_modules",
"**/*.d.ts"
]
}
答案 0 :(得分:3)
<强> TL; DR:强>
从
修改moment.d.ts
文件
export = moment;
到
declare module 'moment' {
export default moment;
}
<强>讨论:强>
看起来答案在于使用
跟踪模块分辨率 tsc --traceresolution'
你可以确切地看到它到底发生了什么。例如,
import moment from 'moment'
仅在TypeScript文件中查找:
File 'C:/Code/Trunk/moment.ts' does not exist.
File 'C:/Code/Trunk/moment.tsx' does not exist.
File 'C:/Code/Trunk/moment.d.ts' does not exist.
然后查找节点包:
File 'C:/Code/Trunk/node_modules/@types/moment.d.ts' does not exist.
File 'C:/Code/Trunk/node_modules/@types/moment/package.json' does not exist.
File 'C:/Code/Trunk/node_modules/@types/moment/index.d.ts' does not exist.
当我使用直接的.js文件时,我需要使用AMD语法,因此它会寻找除TypeScript文件之外的其他内容,例如
import moment = require('libs/moment')
哪个收益
File 'C:/Code/Trunk/Mobile/Project/scripts/libs/moment.js' exist - use it as a name resolution result.
成功!几乎! Funnily TSC现在没有提供与时刻有关的错误,但在运行时我从RequireJS得到了这个错误:
Uncaught Error: Load timeout for modules: libs/moment
我只能假设是因为moment.js
没有AMD导出,并且在我的RequireJS配置中我有:
shim: {
moment: {
exports: "moment"
}
}
为我创建了AMD导出。因此,问题是JS方面的事情很好,因为RequireJS创建了它自己的导出,但TS方面的事情并不知道,所以当我尝试在TS代码中使用它时编译器会抱怨。
即使明确指定.d.ts文件也不起作用:
/// <reference path="../../typings/moment.d.ts" />
给予
error TS2304: Cannot find name 'moment'.
所以问题就是那个时刻不会以我们使用它的方式导出自己,例如命名空间,所以我让它工作的唯一方法就是从
修改moment.d.ts
文件
export = moment;
到
declare module 'moment' {
export default moment;
}
它现在完美无缺,没有进口或任何东西!
答案 1 :(得分:0)
我曾经遇到过同样的问题。尝试:
import moment from 'moment';