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.ts
declare 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 declarations

declare 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
    }
  }
}

İlgili makaleler