MetaClass'lar TypeScript'te mümkün değil mi


Örneğin, aşağıdakiler derlenmeyecek (TypeScript oynatma alanı örneğine bağlantı):

declare class ClassFactory {
    constructor();
    new(): any;
}

const User = new ClassFactory();
const user = new User();

Oluşan hata:

Cannot use 'new' with an expression whose type lacks a call or construct signature.

Ek açıklamalara ihtiyacım var mı? Bir MetaClass'ı nasıl beyan edebilirim? new(): any; ifadesinin sınıfta bir prototip yöntemi olarak alındığını, dolayısıyla örneklerin oluşturma deseni olduğunu varsayıyordum.

DÜZENLE: bağlantı düzeltildi

Cevap #1

Onlar mümkündür. İşte hızlı bir örnek:

declare class User{}
declare interface ClassFactory {
    new(): typeof User;
}
declare var ClassFactory: ClassFactory;

const UserClass = new ClassFactory();
const user = new UserClass(); // user has type `User`

Çeşitli parçaların bir açıklaması

  • “Bu şey new ile çağrıldığında bir şey döndürecek” demek için bir class kullanamazsınız. Bu yüzden interface ClassFactory
  • Böyle bir bildirimi variable isim alanından kullanmak için bir değişkene ihtiyacınız vardır. Bu nedenle var ClassFactory
  • Bir şeyin bir class olduğunu, sınıfın bir örneği olmadığını söylemek için : User yapamazsınız, sınıfın türünü almanız gerekir. Bu nedenle typeof User.

Daha

Burada birkaç kez kullanılan temel kavram bildirim alanlarıdır. Bu konu şurada ele alınmıştır: https://basarat.gitbooks.io/typescript/content/docs/project/declarationspaces.html 🌹

İlgili makaleler