TypeScript - ES6 tarzı modüllerle bildirim birleştirme
Express'in Request arayüzüne bir id özelliği eklemek istiyorum. Express'in DefinitelyTyped bir tip tanımı var. Birleştirme için arayüzü belirtmenin her yolunu denedim, bunların hepsi bir hata ile sonuçlandı veya işe yaramadı.
ES6 tarzı modül importları kullanarak Express'in tiplerine erişiyorum: import * as express from 'express';
Express ad alanındaki Request nesnesiyle birleştirmeyi denedim.
declare module Express {
export interface Request {
id: number;
}
}
Bu sessizce hiçbir şey yapmıyor. Kullandığım yeni 1.8 derleyicisinin talimatlarını izleyerek, namespace yerine gerçek modül ile birleştirmeyi denedim:
import { Request } from 'express';
declare module 'express' {
interface Request {
id: number;
}
}
Bu hata verir çünkü Modül genişletmesi üst düzey kapsamda yeni isimler ekleyemez.
Asıl express.d.ts dosyasını açtığımda, tüm arayüzleri içeren bir module e { ... } bulunuyor gibi görünüyor, bunun içinde de export=e; satırını içeren bir declare module "express" { ... } var. Belki bu, ad alanı iç içe geçişi nedeniyle bir sorun olabilir mi?
Bunu doğru şekilde nasıl yaparsınız?
Cevap #1
v1.8 öncesi TypeScript sürümlerinde bu izin verilmedi.
v1.8 ve sonrasında, modül artırımı kullanılabilir. Sözdizimi, ortam beyanları ile aynıdır (sizin sorunuzda gösterdiğiniz gibi) - tek fark, yukarıda paylaştığınız şeyin artık çalışması gerektiğidir.
Modül genişletme, global ve modül kapsamını genişletmenize olanak tanır.
Küresel kapsamı genişletmek için, üç modül adı olarak global kullanırsınız:
declare global {
interface Array<T> {
popFromTop(): T;
}
}
Cevap #2
Görünüşe göre, bu sorun bir derleyici sorunu nedeniyle oluşuyor:
https://github.com/Microsoft/TypeScript/issues/6722
Umarım bu yakında çözülür.
