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
newile çağrıldığında bir şey döndürecek” demek için birclasskullanamazsınız. Bu yüzdeninterface 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
classolduğunu, sınıfın bir örneği olmadığını söylemek için: Useryapamazsınız, sınıfın türünü almanız gerekir. Bu nedenletypeof 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 🌹
