Czytam, jak działa rozdzielczość modułu TypeScript .
Mam następujące repozytorium: @ ts-stack / di . Po skompilowaniu struktura katalogów wygląda następująco:
├── dist
│ ├── annotations.d.ts
│ ├── annotations.js
│ ├── index.d.ts
│ ├── index.js
│ ├── injector.d.ts
│ ├── injector.js
│ ├── profiler.d.ts
│ ├── profiler.js
│ ├── providers.d.ts
│ ├── providers.js
│ ├── util.d.ts
│ └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│ ├── annotations.ts
│ ├── index.ts
│ ├── injector.ts
│ ├── profiler.ts
│ ├── providers.ts
│ └── util.ts
└── tsconfig.json
W moim pakiecie.json napisałem "main": "dist/index.js"
.
W Node.js wszystko działa dobrze, ale TypeScript:
import {Injector} from '@ts-stack/di';
Nie można znaleźć pliku deklaracji dla modułu „@ ts-stack / di”. „/path/to/node_modules/@ts-stack/di/dist/index.js” niejawnie ma typ „dowolny”.
A jednak, jeśli zaimportuję w następujący sposób, wszystko działa:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Co ja robię źle?
typescript
node-modules
ktretyak
źródło
źródło
npm install @types/node --save-dev
require
zamiastimport
jest trochę anty-wzorcem: lepiej zadeklarować moduł w.d.ts
pliku; zobacz moją odpowiedź poniżej.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Jeśli importujesz moduł innej firmy
'foo'
, który nie zapewnia żadnych typów, ani w samej bibliotece, ani w@types/foo
pakiecie (generowanym z repozytorium DefinitelyTyped ), możesz usunąć ten błąd, deklarując moduł w pliku plik z.d.ts
rozszerzeniem. TypeScript szuka.d.ts
plików w tych samych miejscach, w których będzie szukać normalnych.ts
plików: jak określono w „files”, „include” i „exclude” wtsconfig.json
.Następnie po zaimportowaniu
foo
zostanie wpisany jakoany
.Alternatywnie, jeśli chcesz rzutować własne pisma, możesz to zrobić również:
Wtedy to skompiluje się poprawnie:
Nie musisz podawać pełnych typów dla modułu, wystarczy dla bitów, których faktycznie używasz (i chcesz odpowiednich typów), więc jest to szczególnie łatwe, jeśli używasz dość niewielkiej ilości API.
Z drugiej strony, jeśli nie przejmujesz się typowaniem bibliotek zewnętrznych i chcesz importować wszystkie biblioteki bez typowania
any
, możesz dodać to do pliku z.d.ts
rozszerzeniem:Zaletą (i minusem) tego jest to, że możesz importować absolutnie wszystko, a TS się skompiluje.
źródło
d.ts
plików? powinieneś podać jakąkolwiek konfigurację taką jaktypeRoots
?.d.ts
pliki w tych samych miejscach, w których będzie szukał normalnych.ts
plików: jak określono „pliki”, „ dołącz ” i „wyklucz” w plikutsconfig.json
. Nie polecałbym używaćtypeRoots
do tego celu: jest to przeznaczone do lokalizacji modułów typu zewnętrznego (tj.node_modules/@types
), A nie pojedynczych.d.ts
plików..d.ts
plik?Jeśli potrzebujesz szybkiej poprawki, po prostu dodaj ją przed linią importu:
źródło
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
To uczucie, gdy jesteś patrząc na dwa dni i znaleźć to tak: po prostu usunąć
.js
z"main": "dist/index.js"
wpackage.json
i wszystko działa poprawnie!UPD : ta odpowiedź względna, jeśli masz własny pakiet npm, jeśli nie - patrz moja odpowiedź poniżej .
A jeśli powyższa odpowiedź nie rozwiązany importu modułu, spróbuj po prostu dodać
typings
wpackage.json
:Oczywiście tutaj folder
dist
- tam są przechowywane pliki modułu.źródło
declare module "moduleName"
w międzyczasieTypeScript w zasadzie implementuje reguły i dodaje typy do twojego kodu, aby był bardziej przejrzysty i dokładny z powodu braku ograniczeń w JavaScript. TypeScript wymaga opisania danych, aby kompilator mógł sprawdzić kod i znaleźć błędy. Kompilator poinformuje Cię, jeśli używasz niedopasowanych typów, jeśli jesteś poza zasięgiem lub próbujesz zwrócić inny typ. Tak więc, gdy używasz zewnętrznych bibliotek i modułów z TypeScript, muszą one zawierać pliki opisujące typy w tym kodzie. Pliki te nazywane są plikami deklaracji typu z rozszerzeniem
d.ts
. Większość typów deklaracji dla modułów npm jest już napisanych i możesz je uwzględnić za pomocąnpm install @types/module_name
(gdzie nazwa_modułu to nazwa modułu, którego typy chcesz uwzględnić).Istnieją jednak moduły, które nie mają definicji typów, i aby usunąć błąd i zaimportować moduł za pomocą
import * as module_name from 'module-name'
, utwórz foldertypings
w katalogu głównym projektu, w środku utwórz nowy folder z nazwą modułu i tym folder utwórzmodule_name.d.ts
plik i zapiszdeclare module 'module_name'
. Po to właśnie przejdź dotsconfig.json
pliku i dodać"typeRoots": [ "../../typings", "../../node_modules/@types"]
wcompilerOptions
(z właściwą ścieżkę względną do folderów), aby pozwolić maszynopis wie, gdzie można go znaleźć definicje typów bibliotek i modułów i dodać nową właściwość"exclude": ["../../node_modules", "../../typings"]
do pliku. Oto przykład, jak powinien wyglądać plik tsconfig.json:W ten sposób błąd zniknie i będziesz mógł trzymać się najnowszych reguł ES6 i TypeScript.
źródło
index.d.ts
. Poza tym było to jedyne rozwiązanie, które zadziałało dla mnie.Dla każdego, kto to czyta, spróbuj zmienić nazwę pliku .js na .ts
Edycja: Możesz także dodać
"allowJs": true
do pliku tsconfig.źródło
Ten sposób działa dla mnie:
1. dodaj własną deklarację do pliku deklaracji, takiego jak index.d.ts (może w katalogu głównym projektu) 2. dodaj plik index.d.ts do pliku tsconfig.json- edycja: potrzebne cudzysłowy wokół nazwy modułu
źródło
Miałem ten sam problem z użyciem modułu węzła z aplikacją reagującą napisaną na maszynie. Moduł został pomyślnie zainstalowany przy użyciu
npm i --save my-module
. Jest napisany javascript i eksportujeClient
klasę.Z:
Kompilacja kończy się niepowodzeniem z błędem:
@types/my-module
nie istnieje, więc dodałemmy-module.d.ts
plik obok tego, do któregomy-module
jest importowany, z sugerowaną linią. Wtedy dostałem błąd:Klient jest faktycznie eksportowany i działa normalnie, jeśli użyję go w aplikacji js. Ponadto poprzedni komunikat mówi mi, że kompilator szuka odpowiedniego pliku (
/node_modules/my-module/lib/index.js
jest zdefiniowany wmy-module/package.json
"main"
elemencie).Rozwiązałem problem, mówiąc kompilatorowi, że nie dbam o niejawne
any
, to znaczy ustawiłemfalse
następujący wiersztsconfig.json
pliku:źródło
prosty do naprawienia jest:
jeśli chcesz zadeklarować interfejs obiektu (Polecaj dla dużego projektu) możesz użyć:
Jak tego użyć? prosty..
źródło
Ja też to dostawałem, przez pewien czas byłem zdumiony, nawet gdy moduł i typy były już zainstalowane i kilkakrotnie ładowałem IDE.
W moim przypadku naprawiłem to, kończąc procesy terminalowe, usuwając
node_modules
, czyszcząc pamięć podręczną menedżera pakietów węzłów i robiąc nowe,install
a następnie ponownie ładując edytor.źródło
Niestety, nie jest w naszych rękach, czy twórca pakietu przeszkadza plikowi deklaracji. To, co zwykle robię, to taki plik,
index.d.ts
który będzie zawierał wszystkie brakujące pliki deklaracji z różnych pakietów:Index.ts:
źródło
To działało ode mnie.
npm install --save readline
źródło
Próbowałem już wszystkiego tutaj, ale dla mnie był to zupełnie inny problem: musiałem usunąć z moich
*.d.ts
wszelkich instrukcji importu:Po usunięciu błędu zniknął ...
Wyjaśnienie : Kiedy deklarujemy moduł w
*.d.ts
pliku, jest on automatycznie wybierany przez kompilator Typescript jako moduł otoczenia (ten, którego nie trzeba jawnie importować). Gdy określimyimport ... from ...
, plik staje się teraz normalnym modułem (ES6), a zatem nie zostanie pobrany automatycznie. Dlatego jeśli nadal chcesz, aby zachowywał się jak moduł otoczenia , użyj innego stylu importu, takiego jak:źródło
Po prostu możesz go zaimportować, używając następującego kodu:
źródło