Daję szansę na maszynopis. Działa dobrze na scenie Hello world. Teraz próbuję użyć modułu npm:
index.ts
=
import _ = require('lodash')
console.log(_.toUpper('Hello, world !'))
To nie działa:
tsc index.ts
->Cannot find module 'lodash'. (2307)
node-ts index.js
->Cannot find module 'lodash'. (2307)
Przeglądanie dokumentacji maszynopisu i Google nie pomogło. Inne pytania S / O pozostają bez odpowiedzi ( tutaj i tutaj ) lub niezwiązane.
Elementy :
- maszynopis 1.8 najnowszy
- Tak, lodash jest zainstalowany
npm i --save lodash
i istnieje w moim systemie plików (zaznaczone) - Ja też
typings i --save lodash
- warianty
import * as _ from 'lodash'
lubconst _ = require('lodash')
też nie działają - Próbowałem ulepszyć opcje tsconfig.json, jak sugerowano w innych odpowiedziach
"moduleResolution": "node"
i"module": "commonjs"
jak sugerowano w niektórych odpowiedziach, nadal nie działa
Jak konsumujemy pakiet npm w maszynie?
node.js
typescript
npm
tsc
Offirmo
źródło
źródło
///<reference path="../typings/lodash/lodash.d.ts"/>
Odpowiedzi:
[EDYCJA] Wielkie dzięki za tę odpowiedź! Jednak od 2018 roku jest nieaktualny. Czytelnicy, spójrz na inne odpowiedzi.
Istnieje kilka sposobów importowania modułów z npm. Ale jeśli nie dostaniesz wpisów,
tsc
zawsze będzie narzekać, że nie może znaleźć modułu, którego potrzebujesz (nawet jeśli transpiled js faktycznie działa).Jeśli masz pisma i nie używasz
tsconfig.json
, użyj,reference
aby zaimportować typy:/// <reference path="path/to/typings/typings.d.ts" /> import * as _ from 'lodash`; console.log(_.toUpper('Hello, world !'))
Jeśli używasz
tsconfig.json
pliku, upewnij się, że dołączony jest plik z typami (lub nie jest wykluczony, Twój wybór) i postępujimport
podobnie jak w poprzednim przykładzie.W przypadku, gdy nie ma dostępnych typów. Masz dwie możliwości: napisać własną w
.d.ts
pliku lub zignorować sprawdzanie typów w bibliotece.Aby całkowicie zignorować sprawdzanie typu (nie jest to zalecany sposób), zaimportuj bibliotekę do zmiennej typu
any
.const _: any = require('lodash'); console.log(_.toUpper('Hello, world !'))
tsc
będzie narzekać, żerequire
nie istnieje. Podajnode
typy lubdeclare
, aby odrzucić błąd.źródło
ts-node
tak długo, jak przywoływany jest indekstsconfig.json
[2018/12] Nowa, aktualna odpowiedź na to pytanie, które zadałem w 2016 roku, która mimo posiadania nieaktualnych odpowiedzi wciąż wykazuje dużą aktywność.
Krótko mówiąc, TypeScript wymaga informacji o typie o kodzie twojego pakietu (aka „ pliki deklaracji typu ” aka „typowania”) i słusznie mówi ci, że w przeciwnym razie straciłbyś cały sens TypeScript. Istnieje kilka rozwiązań umożliwiających ich udostępnianie lub rezygnację z nich, wymienionych tutaj w kolejności najlepszych praktyk:
Rozwiązanie 0 : moduł już zapewnia wpisywanie. Jeśli jego package.json zawiera taką linię:
"typings": "dist/index.d.ts",
jest już z obsługą TypeScript. Najprawdopodobniej tak nie jest, jeśli czytasz tę stronę, więc kontynuujmy ...
Rozwiązanie 1 : skorzystaj z napisów wniesionych przez społeczność z DefinitelyTyped . W przypadku modułu „foo” spróbuj tego:
jeśli to zadziała, jackpot! Masz teraz wpisy i możesz używać swojego modułu. Jeśli npm narzeka, że nie może znaleźć modułu @ types / foo, kontynuujmy ...
Rozwiązanie 2 : podaj niestandardowe wpisy dotyczące tego modułu. (z opcją zerowego wysiłku)
"include": [ "./typings-custom/**/*.ts" ]
declare module 'foo'
Twój kod TypeScript powinien teraz zostać skompilowany, aczkolwiek BEZ informacji o typie (TypeScript rozważa moduł foo typu „any”).
Możesz także spróbować samodzielnie wpisać informacje o typie, przeglądając oficjalny dokument i / lub przykłady z DefinitelyTyped . Jeśli tak, pomyśl o dodaniu swoich wpisów bezpośrednio do modułu (rozwiązanie 0, jeśli autor modułu akceptuje) lub do DefinitelyTyped (rozwiązanie 1)
źródło
Reference the content of this folder in your tsconfig.json:
daje następujący błąd:Unknown compiler option 'include'.
compilerOptions
Prawdopodobnie brakuje Ci plików deklaracji .
Aby uzyskać więcej informacji, zobacz DefinitelyTyped .
Spróbuj tego:
Teraz możesz importować.
import _ from 'lodash';
Jeśli importowany moduł ma wiele eksportów , możesz to zrobić:
import { Express, Router } from 'express';
Jeśli moduł, który importujesz, „nie ma domyślnego eksportu” , musisz to zrobić:
import * as http from 'http';
źródło
* as _
a nie tak_ from 'lodash'
jak w kodzie ES6?import _ from 'lodash';
W tym przypadku użycie jest lepsze. Zaktualizowałem moją odpowiedź, aby pokazać różne sposoby importowania i dlaczego ich używasz.* as _
to potrzebne, jeśli moduł nie ma domyślnego eksportu. Kompilator tsc ostrzeże o tym.export default <...>
instrukcji. Zapoznaj się z sekcją „Domyślne eksportowanie” w dokumentacji modułów maszynopisu .U mnie to zadziałało.
W folderze typings utwórz nazwę pliku nazwa -modułu.d.ts . Zawiera:
declare module "module-name";
W tsconfig.json przejdź do folderu
"typeRoots": [ "./typings", "../node_modules/@types" ]
źródło
In tsconfig.json, refer to the folder
Unknown compiler option 'typesRoots'.
Otrzymuję ten błąd i żadna z odpowiedzi nie działała dla mnie, ale wymyślam coś, gdy chcesz pracować z modułem węzła w maszynie, zainstaluj je jako
$npm install @types/<module_name>
na przykład
zamiast mówić
źródło