TypeScript React Uygulamasında PropTypes


121

Kullanıyor React.PropTypesTypeScript React Uygulamasında mantıklı mıdır yoksa bu sadece bir "kemer ve askılar" durumu mu?

Bileşen sınıfı bir Propstür parametresiyle bildirildiğinden :

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }

eklemenin gerçek bir faydası var mı

static propTypes {
    myProp: React.PropTypes.string
}

sınıf tanımına?

Yanıtlar:


104

Hem bileşen dikmelerinizi TypeScript türleri olarak korumanın hem de React.PropTypes de aynı anda .

İşte bunu yapmanın yararlı olduğu bazı durumlar:

  • Düz JavaScript tarafından kullanılacak bir bileşen kitaplığı gibi bir paket yayınlama.
  • API çağrısının sonuçları gibi harici girdileri kabul etme ve iletme.
  • Varsa, yeterli veya doğru yazımlara sahip olmayan bir kitaplıktaki verileri kullanmak.

Bu nedenle, genellikle derleme zamanı doğrulamanıza ne kadar güvenebileceğiniz sorusudur.

TypeScript'in daha yeni sürümleri artık sizin React.PropTypes( PropTypes.InferProps) türünüze dayalı olarak türler çıkarabilir , ancak ortaya çıkan türlerin kullanılması veya kodunuzun başka bir yerinde başvurulması zor olabilir.


1
Lütfen ilk ifadeyi açıklar mısınız?
vehsakul

2
@vehsakul Üzgünüz, açıklama için, TypeScript kullanmayan geliştiriciler tarafından yüklenecek bir paket yazıyorsanız, çalışma zamanında hata alabilmek için yine de PropTypes'e ihtiyaçları vardır. Projeniz sadece kendiniz / diğer TypeScript projeleri içinse, projeniz için TypeScript arayüzleri yeterlidir çünkü proje basitçe oluşturulmayacaktır.
Joel Günü

1
Bu, Webpack seviyesindeki typcript
borN_free

OneOfType istiyorum - OptionalUnion: PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanceOf (Message)]), - typecript birleşim türlerine sahip, ancak bana aynı şeyi vermiyorlar
Mz A

1
Bunu da yapan bir kitaplık yayınladım: github.com/joelday/ts-proptypes-transformer Bir TypeScript derleyici dönüşümü olarak uygulandı ve derin jenerikler, birleşimler vb. İçin doğru propTypes üretiyor. Bazı kaba kenarlar var. herhangi bir katkı harika olurdu.
Joel Günü

141

Typescript ve PropTypes farklı amaçlara hizmet eder. Typescript , derleme zamanında türleri doğrular , oysa PropTypes çalışma zamanında kontrol edilir .

TypeScript, kod yazarken kullanışlıdır: React bileşenlerinize yanlış türde bir argüman iletirseniz sizi uyarır, size işlev çağrıları için otomatik tamamlama sağlar, vb.

PropTypes, bileşenlerin harici verilerle nasıl etkileşim kurduğunu test ettiğinizde, örneğin bir API'den JSON yüklediğinizde kullanışlıdır. PropTypes, aşağıdakiler gibi yararlı mesajlar yazdırarak bileşeninizin neden başarısız olduğunu (React'in Geliştirme modundayken) ayıklamanıza yardımcı olacaktır:

Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`

Typescript ve PropTypes aynı şeyi yapıyor gibi görünse de, aslında hiç örtüşmüyorlar. Ancak, türleri iki kez belirtmenize gerek kalmaması için Typescript'ten otomatik olarak PropTypes oluşturmak mümkündür, örneğin bakınız:


1
PropTypes ve Typescript türleri senkronizasyondan kolayca çıkıyor mu? Bize söyleyecek bakım tecrübesi olan var mı?
Leonardo

9
Bu doğru cevap! PropTypes (çalışma zamanı), statik tür denetimi (derleme zamanı) ile aynı değildir. Dolayısıyla her ikisini de kullanmak 'anlamsız bir egzersiz' değildir.
hans

1
Statik türlerin PropTypes'ten nasıl çıkarılabileceğine dair güzel bir açıklama: dev.to/busypeoples/…
hans

Sıcak yeniden yükleme ve eslint ile vue cli'ye sahip olduğunuzda çalışma zamanı vs derleme zamanı mantıklı değildir. Kaydederken hatalar oluşturur.
Julia

1
@ Julia, çalışırken yeniden yüklemenin çalışma zamanıyla hiçbir ortak yanı yoktur. Sıcak yeniden
yüklemeyle bile

4

Props türünün derleme zamanında çıkarılamadığı bazı karışık durumlarda, o zaman kullanımdan kaynaklanan uyarıları görmek faydalı olacaktır. propTypes , çalışma zamanında kullanımdan .

Böyle bir durum, kontrolünüz dışındaki bir harici API gibi tür tanımlarının mevcut olmadığı harici bir kaynaktan veri işlenirken olabilir. Dahili API'ler için, zaten mevcut değilse, tip tanımları yazma (veya daha iyisi, oluşturma) çabasına değer olduğunu düşünüyorum.

Bunun dışında herhangi bir fayda görmüyorum (ki bu yüzden kişisel olarak hiç kullanmadım).


7
PropTypes doğrulaması, dinamik olarak yüklenen (sunucudan AJAX aracılığıyla gelen) veri yapılarını doğrulamak için de mantıklıdır. PropTypes, çalışma zamanı doğrulamasıdır ve bu nedenle, bazı şeylerde hata ayıklamaya gerçekten yardımcı olabilir. Problemler net ve insan dostu mesajlar çıkaracaktır.
e1v
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.