Как использовать модули npm из машинописного текста?

53

Я делаю снимок typescript. Он отлично работает на мировой арене. Теперь я пытаюсь использовать модуль npm:

index.ts=

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

Это не работает:

  • tsc index.tsCannot find module 'lodash'. (2307)
  • node-ts index.jsCannot find module 'lodash'. (2307)

Анализ документации typescript и в google не помог. Другие вопросы S/O остаются без ответа (здесь и здесь) или не связаны.

Элементы:

  • typescript 1.8 последняя
  • Да, lodash установлен npm i --save lodash и существует в моей файловой системе (отмечен)
  • Я также сделал typings i --save lodash
  • варианты import * as _ from 'lodash' или const _ = require('lodash') не работают либо
  • Я попытался настроить параметры tsconfig.json, как предложено в других ответах "moduleResolution": "node" и "module": "commonjs", как это было предложено в некоторых ответах, по-прежнему не работает.

Как мы используем пакет npm в typescript??

  • 2
    Вы добавили ссылку на lodash.d.ts в ваш index.ts? Это должно выглядеть примерно так: ///<reference path="../typings/lodash/lodash.d.ts"/>
  • 0
    @ Гранга Это работает. Вы можете добавить это как ответ?
Показать ещё 1 комментарий
Теги:
npm
tsc

4 ответа

12
Лучший ответ

[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: предоставить пользовательские наборы об этом модуле. (с возможностью сделать ноль усилий)

  1. Создайте папку с именем "typings-custom" в корне вашего проекта
  2. Ссылка на содержимое этой папки в вашем tsconfig.json:
"include": [
    "./typings-custom/**/*.ts"
]
  1. Создайте файл с таким точным именем: foo.d.ts [foo = имя модуля] с содержанием:
declare module 'foo'

Ваш код TypeScript теперь должен компилироваться, хотя и без информации о типе (TypeScript учитывает модуль foo типа "любой").

Вы также можете попытаться написать информацию о типе самостоятельно, взглянув на официальный документ и/или на примеры из DefiniteTyped. Если вы это сделаете, подумайте о том, чтобы внести свой набор текста либо непосредственно в модуль (решение 0, если автор модуля принимает), либо в DefiniteTyped (решение 1).

  • 1
    Привет, не стесняйтесь пометить ваш ответ как принятый, он гораздо более современный, чем мой. Спасибо, что нашли время, чтобы написать это!
  • 0
    @ Blackus спасибо за предложение. Шляпа тебе, прекрасный гражданин!
51

[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 его, чтобы отменить ошибку.

  • 1
    Полный ответ с 3 решениями. +1
  • 0
    Дополнение: он работает даже с ts-node если на индекс tsconfig.json есть ссылка на tsconfig.json
Показать ещё 2 комментария
12

Вероятно, вам не хватает Файлы декларации.

Подробнее см. DefinitelyTyped.


Попробуйте следующее:

npm install --save lodash
npm install --save @types/lodash

Теперь вы можете импортировать.

import _ from 'lodash';

Если импортируемый модуль имеет несколько экспонатов, вы можете сделать это:

import { Express, Router } from 'express';

Если модуль, который вы импортируете, не имеет экспорта по умолчанию, вам нужно сделать это:

import * as http from 'http';
  • 0
    Почему мы должны использовать * as _ а не просто _ from 'lodash' как в коде ES6?
  • 0
    @JohnnyQ Хороший вопрос. Использование import _ from 'lodash'; лучше в этом случае. Я обновил свой ответ, чтобы показать различные способы импорта и причины их использования.
Показать ещё 3 комментария
0

Это сработало для меня.

  1. Создайте папку с именем "typings".
  2. В папке "Typings" создайте имя файла module-name.d.ts. Это содержит:

    declare module "module-name";

  3. В tsconfig.json, обратитесь к папке

    "typesRoots": [ "./typings", "../node_modules/@types" ]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню