ComSemRel – raport wojenny #4
Od ostatniego raportu minął tydzień, więc pora przyznać się po raz kolejny, jak bardzo mało udało mi się zrobić. Na szczęście tym razem wymówką nie jest bynajmniej lenistwo, a permanentny brak czasu, który poświęcam na rzeczy inne niż konkurs i rozwijanie moich pet projektów (tak, mimo wszystko mam życie!).
Niemniej w tym tygodniu udało się zrobić zdecydowanie więcej niźli w poprzednim i prawie mogę odznaczyć jeden z punktów na zeszłotygodniowej liście – ten o przeniesieniu interfejsów do oddzielnego repozytorium i pakietu. Co prawda przenieść przeniosłem i są obecnie dostępne jako pakiet @comsemrel/interfaces
, niemniej nie udało mi się jeszcze do końca wymyślić, jak powinny wyglądać.
Na chwilę obecną mam 4 podstawowe intefejsy, które będą występować w większości comsemrelowych pakietów:
ICommand
– to cudeńko ma na razie jedną metodę,exec
, i w długiej perspektywie ma opisywać wszystkie komendy możliwe do wywołania przy pomocy programucomsemrel
;IInput
– ten interfejs ma z kolei opisywać wszystkie sposoby na pobieranie danych od użytkownika (kreatory, pytania, opcje wyboru itd.);IOutput
– ten interfejs ma opisywać wszelkie sposoby pokazywania danych użytkownikowi (kolorowe komunikaty, confetti i inne takie);IRenderer
– połączenieIInput
iIOutput
.
Teraz wystarczy tylko sensownie je zaplanować.
Przy okazji chciałbym zwrócić uwagę na sztuczkę, którą zastosowałem, żeby uzyskać ładne interfejsy w osobnym pakiecie:
tsc src/index.ts --declaration --declarationDir dist --outDir temp && rimraf temp
Szukając rozwiązania mojego problemu, natknąłem się na wątek na SO, w którym stwierdzono, że trzymanie intefejsów w oddzielnych plikach najlepiej zrealizować przy pomocy plików .d.ts
, czyli tzw. plików deklaracji. Dlatego też generuję te pliki przy pomocy flag --declaration
i --declarationDir
. Z racji tego, że potrzebuję tylko plików .d.ts
, bez przerobionych plików .js
, to zapisuję pliki .js
do folderu temp
, który od razu usuwam przy pomocy rimraf
. Hack brudny jak nie wiem co, ale działa – więc who cares?
Niemniej to nie rozwiązuje problemu do końca, bo TS przy próbie importu interfejsu z tak przygotowanego pakietu npm:
import { ICommand } from '@comsemrel/interfaces';
rzuca się, że nie może go odnaleźć… Okazuje się, że dla takich pakietów trzeba deklarować w pliku package.json
miejsce przechowywania plików z deklaracjami. To sprawia, że moje pola main
i typings
wskazują na ten sam plik. I znów: brudne jak nie wiem, ale działa.
Tym sposobem udało mi się stworzyć zbiór interfejsów, które będę mógł z powodzeniem dzielić pomiędzy poszczególnymi częściami ComSemRela.
Komentarze
Przejdź do komentarzy bezpośrednio na Githubie.
Dawne komentarze
Ten blog wcześniej korzystał z systemu komentarzy Disqus. Jednakże pożegnaliśmy się i postanowiłem, że zaimportuję do nowej wersji stare komentarze z niego. Cóż, jego system eksportu na wiele nie pozwala…
Widzę, że uparty jesteś.