node.js - Kaynak olmadan TypeScript Projesini NPM'e Yayınlama


Problem: Yapılandırılmış klasörlerde birçok .ts dosyası olan bir kütüphane oluşturdum. Şimdi bu kütüphaneyi yayınlamak istiyorum, ancak kaynak (typescript dosyalarını) paylaşmak istemiyorum.

Deneme: tsc komutunu çalıştırdığımda, her bir .ts dosyasına karşılık gelen bir .js dosyası oluşturur. tsconfig.json dosyamda declaration: true tuttuğumda ise, tsc ayrıca her bir .ts dosyası için bir .d.ts dosyası da oluşturur.

Meydan Okuma: Tüm .js dosyalarım beklenen şekilde yapısal olarak oluşturuluyor, ancak .d.ts dosyaları da .js dosyasının bulunduğu paralel konumda oluşturuluyor. Şimdi meydan okuma şu ki, bu şekilde bu kütüphanenin herhangi bir kullanıcısı tipleri nasıl içe aktaracak; çünkü hepsi farklı klasörlerde dağılmış durumda ve tsc tarafından tek bir .d.ts dosyası oluşturulmuyor.

NPM üzerinde birçok modül görüyorum (örneğin https://github.com/winstonjs/winston) tek bir index.d.ts dosyası yayımlıyor ve kullanıcılar bunları içe aktararak kullanıyor ve Typescript avantajından yararlanıyor.

Şu anda proje yapım aşağıdaki gibi görünüyor:

- my-project-root-directory
    - src
        - demo
            - main.ts
            - sample.ts
        -lib
            - constants
                - some_constant_file1.ts
            - models
                - some_model_file1.ts
                - some_model_file2.ts
            - util
                - some_util_file.ts
    - dist
        - demo
            - main.js
            - main.d.ts
            - sample.js
            - sample.d.ts
        -lib
            - constants
                - some_constant_file1.js
                - some_constant_file1.d.ts
            - models
                - some_model_file1.js
                - some_model_file1.d.ts
                - some_model_file2.js
                - some_model_file2.d.ts
            - util
                - some_util_file.js
                - some_util_file.d.ts
    - logs
    - package.json
    - tsconfig.json

Açıkça bir index.d.ts dosyası yok, tek bir dosyayı nasıl alabilirim? Tek bir .d.ts dosyası yaklaşımı doğru yol mu? Yoksa yanlış yöne mi gidiyorum?

Stackoverflow'da ve Youtube'da birçok cevabı zaten gördüm, hepsi sadece tek bir index.ts dosyası ve buna karşılık gelen index.d.ts dosyası içeren basit bir örnek gösteriyor. Ama amacımı çözen mükemmel bir yol bulamıyorum.

Sorumu okuduğunuz için teşekkürler, her türlü yardım hoş karşılanır.

Cevap #1

İşte ben nasıl ilerlerdim:

  1. Her klasörde, kütüphane kullanıcıları için anlamlı olan türleri dışa aktaran bir index.ts dosyası oluşturun. Örneğin: src/lib/constants/index.ts, src/lib/models/index.ts, ... Her index.ts dosyası, kendi klasöründe bulunan tüm TypeScript türlerini ve alt klasörlerindeki tüm index.ts dosyalarını dışa aktarır.
  2. Tüm src/... alt klasörlerinden her şeyi dışa aktaran merkezi bir src/index.ts dosyası oluşturun.
  3. package.json dosyanızda, types: "dist/index.d.ts" girişini ekleyin.
  4. .npmignore dosyanızda, bir src/ girişi ekleyin.

Bu yaklaşımla, tüm ithalatlarınızı merkezi bir dist/index.d.ts dosyasında referanslandırmış olursunuz, böylece kütüphanenizin kullanıcıları paketinizin farklı yerlerinden tipleri ithal etmek zorunda kalmaz. Ayrıca, TypeScript kaynaklarını hiç dağıtmazsınız.

İşte dizin yapınızın nasıl görünebileceğine dair bir örnek. dist klasörünü hariç tuttum, ancak her klasörde bir index.js ve index.d.ts dosyası da oluşturulacaktır:

- my-project-root-directory
    - src
        - index.ts
        - demo
            - main.ts
            - sample.ts
        -lib
            - constants
                - some_constant_file1.ts
                - index.ts
            - models
                - some_model_file1.ts
                - some_model_file2.ts
                - index.ts
            - util
                - some_util_file.ts
                - index.ts
    - logs
    - package.json
    - tsconfig.json

Örneğin, src/lib/constants/index.ts dosyanız şöyle görünebilir:

export * from './some_constant_file1.ts'

Senin src/lib/index.ts dosyan:

export * from './constants';
export * from './models';
export * from './util';

src/index.ts dosyanız:

export * from './lib';

İlgili makaleler