Typescript: "Не удается найти модуль" с действительными типом
Я только что начал новый проект nodejs, используя typescript. Я установил Typings (https://github.com/typings/typings) и использовал это для установки файлов справки для node v4.x и express v4.x.
Моя версия node v4.2.6
Моя версия typescript v1.7.5
Каталог моего проекта выложен таким образом:
package.json
tsconfig.json
typings.json
src/
app.ts
typings/
main.d.ts
main/ambient/node/node.d.ts
main/ambient/express/express.d.ts
Содержимое typings/main.d.ts выглядит следующим образом:
/// <reference path="main/ambient/express/express.d.ts" />
/// <reference path="main/ambient/node/node.d.ts" />
Содержимое tsconfig.json выглядит следующим образом:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
}
}
Содержимое off typings.json выглядит следующим образом:
{
"dependencies": {},
"devDependencies": {},
"ambientDependencies": {
"express": "github:DefinitelyTyped/DefinitelyTyped/express/express.d.ts#dd4626a4e23ce8d6d175e0fe8244a99771c8c3f2",
"node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#1c56e368e17bb28ca57577250624ca5bd561aa81"
}
}
Содержимое src/app.ts выглядит следующим образом:
'use strict';
///<reference path="../typings/main.d.ts"/>
import * as express from "express";
Это чрезвычайно просто и должно привести к базовому приложению. Однако, когда я пытаюсь скомпилировать это, я получаю сообщение об ошибке error TS2307: Cannot find module 'express'.
Я попробовал переупорядочить файлы типизирующих файлов, изменив относительный путь в теге reference path, используя поле files
в tsconfig.json, чтобы указать ссылочные пути вместо использования встроенного тега в файле, но безрезультатно. Я также попытался скомпилировать с помощью gulp-typescript
, gulp-tsc
и tsc
непосредственно в командной строке.
Я получаю подобные ошибки, когда пытаюсь использовать встроенные модули nodejs, такие как crypto
, http
, fs
и т.д.
Эти ссылки кажутся действительными - чего мне не хватает?
Ответы
Ответ 1
Директивы Triple-Slash должны предшествовать любым операторам в вашем файле. Ваш пролог "use strict"
должен появиться после ваших комментариев ссылки так:
///<reference path="../typings/main.d.ts"/>
'use strict';
import * as express from "express";
В качестве продолжения вашего комментария, где вы не получаете никакого испускания для своего импорта: это потому, что TypeScript выполняет импорт. Если вы не используете модуль для некоторого значения, компилятор не выдаст импорт, потому что он предполагает, что вам нужен только этот модуль для его типов.
Ответ 2
Ответ Дэниела технически корректен, но на основе вашего tsconfig main.d.ts
все равно будет поднято, поэтому не будет исправлять проблемы для вас.
Я сказал, что нашел проблемы и отправил запрос на перенос: https://github.com/jereynolds/ts-test/pull/1
-
Вероятно, вы должны исключить typings
и node_modules
, иначе компиляция будет содержать повторяющиеся идентификаторы (типизации)/будет медленной (node_modules)
-
typings install serve-static
(необходимо для express
) и mime
(необходимо для serve-static
).
Ответ 3
Я знаю, что это старый вопрос, и извините за то, что столкнулся с ним, но он считается одной из первых ссылок в Google.
Поскольку вышеизложенное не решило мою проблему, и я в конечном итоге решил ее, я решил поделиться... В моем случае проблема была вызвана относительным путем.
Мои наборы были в
typings/bootstrap
typings/react-dom
, typings/react-dom
, typings/react
и т.д.
react-dom
имеет import from 'react'
. Чтобы исправить мой код, я должен был отредактировать его так, чтобы он был '../react/react'
. Просто!
Ответ 4
Ничто из вышеперечисленного не помогло мне, поэтому я надеюсь, что это поможет кому-то еще. (Я использую VS Code).
Эта проблема неожиданно возникла у меня на ровном месте с одним из моих сервисов, на который ссылались несколько модулей. После сохранения совершенно не связанного компонента, который НЕ использовал сервис, два из компонентов, использующих этот сервис, сообщили об ошибке "невозможно найти модуль". Мне удалось это исправить, просто изменив объявление на недопустимую папку, сохранив файл и вернув его обратно на правильный путь.