Я делаю снимок typescript. Он отлично работает на мировой арене. Теперь я пытаюсь использовать модуль npm:
index.ts
=
import _ = require('lodash')
console.log(_.toUpper('Hello, world !'))
Это не работает:
tsc index.ts
→ Cannot find module 'lodash'. (2307)
node-ts index.js
→ Cannot find module 'lodash'. (2307)
Анализ документации typescript и в google не помог. Другие вопросы S/O остаются без ответа (здесь и здесь) или не связаны.
Элементы:
npm i --save lodash
и существует в моей файловой системе (отмечен)typings i --save lodash
import * as _ from 'lodash'
или const _ = require('lodash')
не работают либо"moduleResolution": "node"
и "module": "commonjs"
, как это было предложено в некоторых ответах, по-прежнему не работает.Как мы используем пакет npm в typescript??
[2018/12] Новый, актуальный ответ на этот вопрос, который я задал в 2016 году, который все еще показывает большую активность, несмотря на устаревшие ответы.
Короче говоря, TypeScript требует информацию о типе кода вашего пакета (он же " файлы объявления типов " или "типизацию") и справедливо говорит вам, что в противном случае вы потеряли бы весь смысл TypeScript. Есть несколько решений, чтобы предоставить их или отказаться от них, перечисленных здесь в порядке лучшей практики:
Решение 0: модуль уже предоставляет наборы. Если его package.json содержит такую строку:
"typings": "dist/index.d.ts",
он уже включен TypeScript. Скорее всего, это не тот случай, если вы читаете эту страницу, так что давайте продолжим...
Решение 1. Используйте предоставленные сообществом наборы из DefiniteTyped. Для модуля "foo" попробуйте это:
npm add -D @types/foo
если это работает, джекпот! Теперь у вас есть набор текста и вы можете использовать свой модуль. Если npm жалуется, что не может найти модуль @types/foo, давайте продолжим...
Решение 2: предоставить пользовательские наборы об этом модуле. (с возможностью сделать ноль усилий)
"include": [
"./typings-custom/**/*.ts"
]
declare module 'foo'
Ваш код TypeScript теперь должен компилироваться, хотя и без информации о типе (TypeScript учитывает модуль foo типа "любой").
Вы также можете попытаться написать информацию о типе самостоятельно, взглянув на официальный документ и/или на примеры из DefiniteTyped. Если вы это сделаете, подумайте о том, чтобы внести свой набор текста либо непосредственно в модуль (решение 0, если автор модуля принимает), либо в DefiniteTyped (решение 1).
[EDIT] Большое спасибо за этот ответ! Однако по состоянию на 2018 г. он устарел. Читатели, посмотрите на другие ответы.
Есть несколько способов импортировать модули из npm. Но если вы не наберете тип, tsc
всегда будет жаловаться, что не может найти модуль, который вам требуется (даже если на самом деле работает транспортируемый js).
Если у вас есть наборы и вы не используете tsconfig.json
, используйте reference
для импорта наборов:
/// <reference path="path/to/typings/typings.d.ts" />
import * as _ from 'lodash';
console.log(_.toUpper('Hello, world !'))
Если вы используете файл tsconfig.json
, убедитесь, что ваш файл наборов включен (или не исключен, по вашему выбору), и выполните import
как в предыдущем примере.
В том случае, когда нет доступных наборов. У вас есть два варианта: написать свой собственный в файле .d.ts
или игнорировать проверку типов для библиотеки.
Чтобы полностью игнорировать проверку типов (это не рекомендуемый способ), импортируйте библиотеку в переменную типа any
.
const _: any = require('lodash');
console.log(_.toUpper('Hello, world !'))
tsc
будет жаловаться, что require
не существует. Укажите тип node
или declare
его, чтобы отменить ошибку.
ts-node
если на индекс tsconfig.json есть ссылка на tsconfig.json
Вероятно, вам не хватает Файлы декларации.
Подробнее см. DefinitelyTyped.
Попробуйте следующее:
npm install --save lodash
npm install --save @types/lodash
Теперь вы можете импортировать.
import _ from 'lodash';
Если импортируемый модуль имеет несколько экспонатов, вы можете сделать это:
import { Express, Router } from 'express';
Если модуль, который вы импортируете, не имеет экспорта по умолчанию, вам нужно сделать это:
import * as http from 'http';
* as _
а не просто _ from 'lodash'
как в коде ES6?
import _ from 'lodash';
лучше в этом случае. Я обновил свой ответ, чтобы показать различные способы импорта и причины их использования.
Это сработало для меня.
В папке "Typings" создайте имя файла module-name.d.ts. Это содержит:
declare module "module-name";
В tsconfig.json, обратитесь к папке
"typesRoots": [ "./typings", "../node_modules/@types" ]
///<reference path="../typings/lodash/lodash.d.ts"/>