Mevcut TypeScript arayüzüne modül artırımı yoluyla özellik eklemek hiçbir etki yaratmaz


Benim @types/hapi bağımlılığı olan bir Node uygulamam var. Bu modülde tanımlanmış sınıflardan birine bir özellik eklemek istiyorum. Yeni özelliğimi modül artırımı yoluyla tanımlamayı denedim:

// my-custom-hapi-typings.d.ts
import * as hapi from 'hapi';

declare module hapi {
    interface Server {
        myProperty: string;
    }
}

Bu herhangi bir derleyici hatasına neden olmuyor, ancak Server sınıfına myProperty özelliğini de eklemiyor. Projemin diğer yerlerinde bu özelliğe şöyle başvurmaya çalıştığımda hâlâ hatalar alıyorum:

// my-other-file.ts
import * as hapi from 'hapi';

const server = new hapi.Server({ ... });

// error: Property 'myProperty' does not exist on type 'Server'.
server.myProperty = 'hello'; 

TypeScript derleyicisi neden .d.ts dosyamı görmezden geliyor gibi görünüyor? Bu dosyayı "import" etmem mi gerekiyor yoksa TypeScript derleyicisinin bu dosyanın varlığından haberdar olmasını mı sağlamam gerekiyor? Sadece bir .d.ts dosyasını kaynak dizine yerleştirmenin, TypeScript'in bu genişletmeleri fark etmesi için yeterli olduğunu düşünüyordum.

Cevap #1

Bu senin sorunun:

declare module hapi {

Bu aslında bir namespace tanımlıyor, ES6 modüllerinden önce kullanılan daha eski sözdizimini kullanarak, bu modüller önceden "internal modules" olarak adlandırılıyordu. module hapi yazmak, namespace hapi yazmakla aynı şeydir ve bu gün tercih edilen sözdizimidir. Namespace'ler ve modüller hakkında daha fazla bilgi için buraya bakabilirsiniz.

Dış bir modülü bildirmek için yapmanız gereken tek şey modül adını tırnak içine almaktır:

[...] ortamsal isim alanlarına benzer bir yapı kullanın, ancak sonraki bir import sırasında kullanılacak modülün module anahtar kelimesini ve tırnak içindeki adını kullanırız.

Başka bir deyişle, sadece hapi'yi tırnak içine koyun:

declare module "hapi"

Artık bir ambient (my-custom-hapi-typings.d.ts doğrudan içe aktarılmak zorunda değil) dış modül tanımına sahipsiniz (hangi import "hapi" size ne sunduğunu bildirir) ve içeride bildirilenleri artırabilirsiniz.

Playground'da module hapi ve module "hapi" üzerine fareyi getirdiğinizde, araç ipuçlarındaki farkı göreceksiniz:

Evet, arkasındaki tarih nedeniyle ince ve kafa karıştırıcı.

İlgili makaleler