2016-01-02 21 views
5

Mam pakiet węzłów lokalnych napisany w TypeScript, który chcę użyć w moim rzeczywistym projekcie. Korzystanie KMP mogę zainstalować lokalnych pakietów tak:tsd: zainstaluj lokalny plik definicji

$ npm install --save /path/to/package 

czyli

$ npm install --save /path/to/package.tar.gz 

ten instaluje pliki wymagane .js w katalogu node_modules. W tym pakiecie jest także wygenerowany plik .d.ts, który chciałbym zainstalować w moim projekcie (automatycznie łącząc go w typings/tsd.dts). Ale użycie poniższej komendy nie ma żadnego skutku:

$ tsd install /path/to/package/package.d.ts --save 

Podano >> zero results. Jaki jest więc sposób na zainstalowanie lokalnych plików definicji bez potrzeby korzystania z repozytorium?

UPDATE:

mogę po prostu skopiować plik moi d.ts do katalogu typowania i mojego edytora tekstu (dla mnie to Sublime Text z wtyczką maszynopis) jest w stanie znaleźć deklarację. Układ katalogu jest coś takiego:

/my-project/ 
    /typings/ 
    tsd.d.ts - auto-generated by `tsd install` 
    node/ - I've installed the node definitions 
    my-package.d.ts - copied or symlinked file 
    my-project.ts - I'm working here 

Jednak mam problem przy eksporcie jedyną funkcję w module.exports (exports = function... w maszynopisie). W tym przypadku wyeksportowana funkcja jest trochę "anonimowa" i nie jest nawet nazwana w pliku d.ts, więc muszę ją edytować ręcznie.

Mój przypadek testowy:

'my-pakiet' zapewnia jedną funkcję, zwykle importowane jako 'mypackage':

export = function myPackage(a: string, b: string) { return a + ' ' + b; }; 

declaration jest ustawiony na true w tsconfig.json, więc komenda tsc wygenerowany plik moi-package.d.ts:

declare var _default: (a: string, b: string) => string; 
export = _default; 

Mój pakiet ma być używany jak to w moim projekcie:

import myPackage = require('my-package'); 
myPackage('foo', 'bar'); 

Jednak TSC nie może znaleźć myPackage, choć my-package.d.ts został skopiowany do folderu typowania. Muszę edytować ten plik, więc wygląda to tak:

declare var myPackage: (a: string, b: string) => string; 
//export = _default; - not needed 

Albo nawet lepiej dla prawidłowego funkcjonowania require():

declare module 'my-package' /* this is the string passed to require() */ { 
    export = function(a: string, b: string): string; 
} 
+1

importowanie plików d.ts z node_modules (właśnie skopiowałem tam plik) wydaje się działać dobrze dla mnie, nie ma potrzeby, aby tsd zrobił cokolwiek. – toskv

+0

masz rację, toskv, mogę po prostu skopiować plik d.ts bez potrzeby odwoływania się do niego w typach/tsd.dts. Napotkaliś my problem, jeś li ustawię zmiennĘ ... eksportu, zaktualizowałem mój post z dodatkowymi informacjami na ten temat. – Simon

Odpowiedz

5

W Twoim pakiecie węzła dodać wpis typescript > definition w package.json:

{ 
    "name": "your-package", 
    ... 
    "typescript": { 
    "definition": "package.d.ts" 
    } 
} 

Następnie po zainstalowaniu pakietu w projekcie uruchom polecenie ...

tsd link 

... które doda odniesienie do package.d.ts w pliku projektu tsd.d.ts (reference).


Ponadto, na podstawie swojej zmiany, proponuję zmienić plik definicji do czegoś takiego (zwróć uwagę na cudzysłowy wokół my-package):

declare module "my-package" { 
    function myPackage(a: string, b: string): string; 
    export = myPackage; 
} 

który pozwoli pracować z następującego kodu :

import myPackage = require('my-package'); 
myPackage('foo', 'bar'); 
+0

dziękuję, zadziałało! jednak moje źródło TypeScript (z typingiem) znajduje się w oddzielnym katalogu od skompilowanego skryptu JavaScript (z pakietem pack.json i node_modules), czy istnieje sposób na sprawdzenie, czy działa on również tutaj? – Simon

+0

@Simon Nie jestem do końca pewien, co masz na myśli. Przy tej konfiguracji musisz tylko upewnić się, że plik definicji pakietu jest dołączony do pakietu (nie ma potrzeby dołączania źródła pakietu do maszynopisu). Spowoduje to dodanie do aplikacji czegoś w rodzaju '/// ' do '~/typings/tsd.d.ts' . Dopóki plik definicji zawiera wszystkie niezbędne informacje, powinien on w tym momencie dobrze się skompilować. Przy okazji, na podstawie twojej edycji zobacz moją edycję dotyczącą zmiany pliku definicji ... Wiem, że sposób, w jaki tu pokazuję działa. –

+0

Nie jestem pewien, czy nie rozumiem twojego punktu widzenia, czy nie rozumiesz, o co mi chodzi. Jednak zrobienie najnowszej edycji za pomocą 'declare module ... 'i po prostu skopiowanie pliku d.ts do folderu typowania mojego projektu działa teraz idealnie! – Simon

1

Jak maszynopisu 1.6 można odwoływać plik definicji typu od ciebie package.json i rozdzielczości moduł maszynopis powinien być w stanie odkopać definicja typu.

W pliku package.json (lokalnego modułu npm) dodaj pozycję "typings", np.

{ 
    "name": "my-package", 
    "typings": "./relative/path/to/my-package.d.ts" 
} 

W ten sposób nie musisz w ogóle korzystać z TSD.

See maszynopis Wiki: https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages

8

Nawet jeśli trik z package.json pracuje, ja raczej wolę narzędzi wykonanych z tego (TSD lub typowania).

Właśnie znalazłem odpowiedź dla typowania:
typings install --save --ambient file:./node_modules/.../file.d.ts

Myślę, że to samo z TSD :)

EDIT:
Od maszynopis 2,0 typowania jest bezużyteczny.
Po prostu uruchom npm i --save-dev @types/some-library

+2

--ambient jest teraz zastąpiony przez --global (testowany na v1.3.2) – angularsen

+2

Jaki jest odpowiednik tego dla nowego podejścia TypeScript 2 do nabywania plików definicji typów ('npm install @types/...')? Możesz 'typings install file: ...' zainstalować pojedynczy plik definicji, ale możesz tylko 'npm install' pakiet. – danvk

+0

@danvk Edytowałem mój post – Maxime