Подтвердить что ты не робот

Как потреблять модули npm из typescript?

Я делаю снимок 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??

4b9b3361

Ответ 1

[2018/12] Новый, актуальный ответ на этот вопрос, который я задал в 2016 году, который по-прежнему показывает большую активность, несмотря на устаревшие ответы.

Короче говоря, TypeScript требует информацию о типе о коде вашего пакета (он же "файлы объявлений типов" или "типизацию") и справедливо говорит вам, что в противном случае вы потеряли бы весь смысл Машинопись. Существует несколько решений для их предоставления или отказа от них, перечисленных здесь в порядке наилучшей практики:


Решение 0: модуль уже предоставляет наборы. Если его package.json содержит такую строку:

"typings": "dist/index.d.ts",

он уже поддерживает TypeScript. Скорее всего, это не тот случай, если вы читаете эту страницу, так что давайте продолжим...


Решение 1: используйте набранные сообществом наборы из DefinitiveTyped. Для модуля "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 типа "любой").

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

Ответ 2

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

Ответ 3

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

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


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

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

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

import _ from 'lodash';

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

import { Express, Router } from 'express';

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

import * as http from 'http';

Ответ 4

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

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

    declare module "module-name";

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

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