« Tüm yayınlar

İkinci middleware Inngest'te TypeScript tiplerini nasıl bozdu

Inngest-js'te iki middleware eklemenin step.run tipini {}'e çökertmesinin kök nedeni: TypeScript'in Pick kısıtlama kontrolündeki bir boşluk.

Inngest-js'e iki middleware eklendiğinde step.run'ın dönüş tipi sessizce {} 'e çöküyordu; tek middleware ile her şey normaldi. Kök neden, her middleware'in varsayılan Jsonify dönüşümünü taşıması ve bunların Jsonify<Jsonify<T>> şeklinde iç içe geçmesiydi — çalışma zamanında zararsız ama tip seviyesinde felaketti.

Sorun, opsiyonel bir özelliğin (?) mapped type üzerinden anahtar listesine undefined olarak sızmasından kaynaklanıyordu. TypeScript bunu Pick<T, K> generic tanımının içinde, T henüz somutlaşmamışken kısıtlama kontrolünden geçiriyor; tip somut hale geldiğinde ise bu kontrol tekrar çalışmıyor. Sonuç, anahtar kümesinde undefined barındıran, görünüşte sağlıklı ama aslında bozuk bir tip. İkinci Jsonify uygulaması bu anahtarı T[undefined] olarak işleyip derleyicinin dahili hata tipine düşüyor ve her şey {} 'e indirgeniyor — hiçbir tanı mesajı vermeden.

Topluluktan gelen iki düzeltme belirtileri gideriyor ama kökü çözmüyordu: biri sadece varsayılan dönüşüm zincirlerini kapsıyor, diğeri ise unknown içeren tipler ve step.invoke gibi başka kompozisyon noktalarında yeniden ortaya çıkıyordu. type-fest'in kendi FilterDefinedKeys ve FilterOptionalKeys yardımcıları aynı undefined sızıntısını zaten Exclude ile engelliyordu; sadece Jsonify'ın kullandığı filtre bu adımı atlamıştı.

Gerçek düzeltme, undefined'ı anahtar birleşiminden en baştan çıkarmak oldu; bu da tüm kompozisyon noktalarını tek seferde onarıyor ve type-fest'e upstream olarak gönderildi. Ayrıca ortaya çıkan bir ders: IsEqual ile yazılan tip testleri, iki tip takma adını ertelenmiş haldeyken karşılaştırdığı için bu hatayı yakalayamıyordu — gerçek doğrulama ancak özellik erişimiyle tipin değerlendirmeye zorlanmasıyla mümkün oldu.