在没有NPM的情况下引用TypeScript中的momentJs

时间:2017-01-20 00:22:08

标签: typescript requirejs momentjs

使用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"
  ]
}

2 个答案:

答案 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';