Bir JavaScript nesne literalinin bir TypeScript sınıfı ile aynı özelliklere sahip olup olmadığını nasıl test edebilirsiniz?
Hedef
Bir JavaScript nesnesinin bir TypeScript türüne uygun olduğunu çalışma zamanında doğrulamak için bir birim testi yazmak istiyorum. Bunu yapmak için, türü bir kez tanımlamama ve ardından hem TypeScript derleme zamanı kontrolleri hem de JavaScript çalışma zamanı kontrolleri için kullanmama olanak sağlayan bir yol arıyorum. Çözümün iç içe sınıf yapılarına izin vermesi gerekir.
Kod
Çünkü bir kod örneği 1000 kelimeye bedeldir... sorunun kaynağı için "???"'ya bakın:
Hedef Birim Testi
it('object literal and TypeScript class should be compatible, () => {
??? psudo-code on line below ???
const isCompatible = (myLiteral ~has matching properties with~ MyClass)
expect(isCompatible).toBeTrue();
});
JavaScript Nesne Sözdizimi
var myLiteral = {
entities: {
users: {
'1': { id: 1 },
'2': { id: 2 }
}
}
}
TypeScript'te tanımlanan sınıflar
class MyClass {
entities: Entities;
}
class Entities {
users: { [key: string]: User };
}
class User {
id: number;
}
Arka plan
Bir nesneyi normalleştirmek için normalizer kullanıyorum. normalize metodunun çıktısı güçlü bir şekilde tiplenmiş değil - bu nedenle çıktıyı tekrar güçlü bir tipe almak için as anahtar kelimesinin kullanılması gerekecek. Bu, gelecekte kod tabanına farkında olmadan hataların eklenebileceği potansiyel bir nokta.
TypeScript'te kullandığım önceden tanımlanmış türlerle normalizr çıktısının uyumlu olduğunu doğrulamak için birim testleri yazmak istiyorum
Güncel Fikirler
TypeScript arayüzleri ve tipleri çalışma zamanında mevcut değildir... Ama sınıflar vardır ve tipler sınıflardan türetilebilir. Bu gerçeği hedefime ulaşmak için kullanmanın bir yolu olduğunu umuyorum. Ya da belki başka bir kod üretilme yolu vardır. Ancak, şimdilik hiçbirini bulamadım. Ya da belki yukarıda yaptığım yaklaşım bir şekilde yanlış ya da gözden kaçırdığım açık bir şey var. Bununla ilgili her türlü geri bildirim memnuniyetle karşılanır.
Cevap #1
Typescript Json Schema projesi, TS sınıflarından JSON şemaları üretir. Bunlar, çalışma zamanında JS nesne literallerini doğrulamak için kullanılabilir.
API’ime girilen verileri doğrulamak ve makul yanıtlar üretmek (ör. MyClass nesnesinde entities özelliği eksik) için kütüphaneyi kullandım.