express - Dış TypeScript arayüzünü nasıl geçersiz kılarsınız
Bir TypeScript projesinde passport kullanıyorum. Passport için DefinitelyTyped tip tanımı, Express isteğini user özelliğini içerecek şekilde geçersiz kılıyor. Ancak kullanıcıyı boş bir arayüz olarak tanımlıyor:
index.d.tsdeclare global {
namespace Express {
...
// tslint:disable-next-line:no-empty-interface
interface User {}
interface Request {
...
user?: User;
...
}
}
}
Ancak başvurum boyunca req.user'in bu türde bir arayüz olmasını istiyorum:
interface User {
id: number
username: string,
profilePicture: string,
name: string
}
Uygulamamın her yerinde req.user as User | null yazmaktan yoruldum. Tanım dosyasındaki arayüz tanımını doğrudan geçersiz kılabilirim ama bu, tipi güncellediğimde muhtemelen üzerine yazılacak bir node_modules dosyasını değiştirmek gibi göründüğü için kötü bir uygulama gibi duruyor.
src klasörüme Express.User'ı geçersiz kılan bir tanım dosyası yazmanın bir yolu var mı? Tanım dosyasını kopyalayıp src dizinime ekleyerek değiştirmeyi denedim ama şöyle diyor
Augmentations for the global scope can only be directly nested in external modules or ambient module declarationsdeclare global olmadan tsc, req.user’i hâlâ boş bir arayüz (interface) olarak ele alıyor.
tsconfig.json dosyasında bu geçersiz kuralı almak için hangi yapılandırmayı eklemem gerekiyor?
Cevap #1
Aynı kapsam içindeki arayüz beyanları birleştirilir. Yani, aşağıdaki
interface A {
name: string;
}
interface A {
id: number;
}
tek bir arayüz, yani A, iki özellikle, name ve id ile tanımlar.
Bu nedenle, türleri ayarlamak için pasaport tarafından kullanılan aynı tekniği basitçe kullanın.
Benim uygulamam, express gibi herhangi bir bağımlılığın tür bildirimlerini artırmak istediğimde, projemin kök dizininde bir artırmalar dosyası oluşturmaktır.
augmentations.d.ts
// ensure file is parsed as a module
export {}
// access the global scope inside our module
declare global {
namespace Express {
// introduce another declaration of interface Express.User which will merge with any others
interface User {
id: number,
username: string,
profilePicture: string,
name: string
}
}
}
