TypeScript'in türleri nasıl hesapladığını nasıl görebilirim?


18

Sorun: Türlerini daha önce tanımlanmış koşullu türlerden türeyen çok sayıda koşullu türe sahip bir dosya üzerinde çalışıyorum ve bu çok karmaşık ve bir türün nasıl türetildiğini hata ayıklamak zor hale geldi.

"Hata ayıklama" veya nasıl TypeScript derleyici koşullu bir tür üzerinde kararlılığını yapıyor ve nihai türü türetmek için bir yol seçmek nasıl bir yol bulmaya çalışıyorum.

Derleyici seçeneklerini inceledim ve bu alanda henüz bir şey bulamadım ...

Şu anda aradığım şey için bir benzetme, DEBUG=express:*bir ekspres sunucunun ne yaptığını görmek istiyorsanız kullanabileceğiniz ayar türüne eşdeğerdir .

Ancak, çözmeye çalıştığım asıl sorun, bir türün büyük karmaşık hiyerarşik tip tanımında nasıl türetildiğini çözmek ve hata ayıklamak.

Önemli Not: TypeScript projesinin çalışma zamanı yürütmesinde hata ayıklamaya çalışmıyorum. Türleri TypeScript derleyici tarafından nasıl hesaplanır hata ayıklama çalışıyorum.


Sadece iyi bir IDE kullanın, türünüzü örnekleyin ve imleci düzenleyicinizde açılan kaynak dosyadaki değerin üzerine getirin. Bu öneriyi kullanarak kaçırdığınız ek bilgiler var mı?
Patrick Roberts

@PatrickRoberts - cevap için teşekkürler. Bunu yaptığımda, koşullu türleri iç içe geçmiş karmaşık bir türe işaret ediyor. Bu da benzer bir karmaşık tipe işaret eder ve devam eder ve bazen açık olmayan bir şekilde dallanır. Bu tip inşaat dalının neden oluştuğunu nasıl ayıklayacağınızı çözmeye çalışıyorum.
Guy

1
Sorunuzun bunu göstermek için somut bir örnekten faydalanacağını düşünüyorum. Daha önce açıkladığınız durumla da karşılaştım, ancak genellikle geçici çözüm türlerinin daha opak oldukları şekilde yeniden yazılmasını içerdiğini görüyorum (örneğin , genişletmeye çalışan interfacegenel yerine kendi kendini belgeleyen bir kapsayıcı adıyla genel typeIDE'nin araç ipucundaki tanım) veya yalnızca karmaşık koşullu türlerin tamamen aşırı kullanılmasını önlemek için kaynağı yeniden düzenleme.
Patrick Roberts

@PatrickRoberts, bu repoyu Hapi / Joi @ 16'ya yükseltmeye ve bu soruna yol açan tür oluşturmada hata ayıklamaya çalışıyor. github.com/TCMiranda/joi-extract-type
Guy

@PatrickRoberts bu, yükseltme için bağlamın kendisini tartışan özel bir sorundur. github.com/TCMiranda/joi-extract-type/issues/22
Guy

Yanıtlar:


1

Söz konusu istenen bilgiyi kapatmak için daktiloda yerleşik bir mekanizma yoktur. Ancak, dahili çalışmayı anlamakla ilgileniyorsanız, koşullu türlerin gerçekten çözümlenmesinin gerçekleştiği kaynak kodundaki yer.

Bu yerlere bir göz atın checker.ts.

ln: 13258 instantiateTypeWorker()
ln: 12303 getConditionalType()
ln: 12385 getTypeFromConditionalTypeNode()
ln: 12772getTypeFromTypeNode()


Ekte dikkatsizce bir araya getirdiğim yarı bitmiş bir daktilo eklentisi. A'nın ham veri yapısını kapatır ConditionalType. Bu yapıyı anlamak için türleri kontrol edin. T ln: 4634.

Bu eklentinin UX'si korkunç, ancak bu yapı, daktilo türünün koşullu bir türün son değerine nasıl karar verdiğini anlatıyor.

Bu eklentiyi çalıştırmak için can sıkıcı bazı ayrıntılı talimatlar:

  1. mkdir my-ts-plugin && cd my-ts-plugin
  2. touch package.json ve yaz { "name": "my-ts-plugin", "main": "index.js" }
  3. yarn add typescript fast-safe-stringify
  4. bu snippet'i kopyalayıp yapıştırın index.ts, derlemek için tsc'yi kullanın.index.js
  5. yarn link
  6. şimdi cdkendi ts projenizin direktifine koşunyarn link my-ts-plugin
  7. eklemek { "compilerOptions": { "plugins": [{ "name": "my-ts-plugin" }] } }için sizintsconfig.json
  8. (.vscode/settings.json)bu satırı ayarlayarak çalışma alanına ekle :{ "typescript.tsdk": "<PATH_TO_YOUR_TS_PROJECT>/node_modules/typescript/lib" }
  9. vscode komut paletini aç ve çalıştır:
    1. TypeScript: Select TypeScript Version... -> Use Workspace Version
    2. TypeScript: Restart TS Server
    3. TypeScript: Open TS Server Log
  10. eklenti çıkışını görebilmeniz gerekir "PLUGIN UP AND RUNNING", şimdi bir ts kod dosyasını açın ve fareyi bazı koşullu tip düğümüne getirin, günlük dosyasına eklenen bir loooooong json veri yapısı görmelisiniz.

Bunun için teşekkürler @ hackape. Ben onunla hack ve ilginç ve hemen hemen VSCode kullanırken interaktif gördüğüm ne liste bazı günlükleri üretebilir böylece beni nerede olduğumdan daha fazla var değil. Bu eklentiyi nasıl çalıştıracağınıza dair iyi talimatlar.
Guy

Ödülünü sana verdim. Beni çözüme kavuşturmamış olsa da, bu eklentiyi değiştirmek için daha fazla çaba harcayarak muhtemelen oraya gidebileceğimi ve yakın gelecekte buna daha iyi bir çözüm olduğunu düşünemiyorum. Yardımınız ve çabalarınız için teşekkürler!
Guy

1
@ Ödül Ödül için teşekkürler. Bu yüzden dün daha yararlı sonuçlar elde etmek için birkaç saat geçirdim. Haklısın. Yukarıdaki veri yapısı, koşullu tip zincirin AST-ish nesnesini yakalar, ancak değerlendirilen sonuç değil sadece çözümlü sonuçtur. "Neden" veya tip çözümleyicinin değerlendirirken hangi koşullu dalda olduğu konusunda, tüm ara adımların sonuçlarının dökülmesini gerektirir, örneğin bir yeri debuggerduraklatmak ve ardından çağrı yığınlarındaki yerel kapsamları manuel olarak aramak gibi.
hackape

1
Ben modifiye getConditionalType()in checker.tsyol boyunca ara bilgi dışarı dökümü bazı yan etkileri mantığı yerleştirirken, bir özel yapı typescript yapmak. Ve bu sefer biraz daha kullanışlı bir şey buldum. Kodumu temizleyip daha sonra bir özgeçmiş ekleyeceğim.
hackape

1
@Gist the gist burada
hackape
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.