2017-01-20 2 views
0

Использование RequireJs, преобразование TypeScript в модули AMD. Не использовать NPM. У меня «allowSyntheticDefaultImports» установлено значение true.Ссылка на momentJs в TypeScript без NPM

У меня есть файл moment.js v2.17.1 в папке libs, скопированный с официального репо, и правильно настроил его с помощью RequireJS, и во время выполнения он отлично работает, так что это всего лишь компиляция типа TypeScript.

TS2304: Cannot find name 'moment'

меня moment.d.ts из официального репозитория в моей папке типизации.

import "moment";

дает ту же ошибку.

import moment = require("moment");

дает TS2307: Cannot find module 'moment'.

Любые идеи?

EDIT: 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

Как выглядит ваш 'tsconfig.json'? – Saravana

ответ

2

TL; DR:

Измените файл moment.d.ts из

export = moment; 

К

declare module 'moment' { 
    export default moment; 
} 

Обсуждение:

Похоже, что ответ заключается в отслеживании решения модуля, используя

tsc --traceresolution'

Вы можете увидеть именно то, что он вытворяет. Например,

import moment from 'moment'

Похоже на данный момент в машинописном только файлы:

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/ABDR/Trunk/Mobile/MyABDR/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 config У меня есть:

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; 
} 

И теперь это прекрасно работает, нет импорта или чего-либо еще!

0

У меня была та же проблема, один раз. Попробуйте:

import moment from 'moment'; 
+0

К сожалению, это дает 'TS2307: Не удается найти модуль 'moment'.' – user917170

+0

about about: import * как момент от« момента »; –

+0

hmm, это может быть связано и с вами: http://stackoverflow.com/questions/41694525/using-moment-js-with-typescript-and-module-amd?rq=1 –

Смежные вопросы