PropTypes in un'applicazione TypeScript React


121

L'utilizzo ha React.PropTypessenso in un'applicazione TypeScript React o è solo un caso di "cintura e bretelle"?

Poiché la classe del componente è dichiarata con un Propsparametro di tipo:

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

c'è qualche vantaggio reale nell'aggiungere

static propTypes {
    myProp: React.PropTypes.string
}

alla definizione di classe?

Risposte:


104

Di solito non c'è molto valore nel mantenere entrambi gli oggetti di scena del componente come tipi TypeScript e React.PropTypesallo stesso tempo.

Ecco alcuni casi in cui è utile farlo:

  • Pubblicazione di un pacchetto come una libreria di componenti che verrà utilizzata da JavaScript normale.
  • Accettazione e trasmissione di input esterni come i risultati di una chiamata API.
  • Utilizzo di dati da una libreria che potrebbe non avere digitazioni adeguate o accurate, se presenti.

Quindi, di solito è una questione di quanto ci si può fidare della convalida in fase di compilazione.

Le versioni più recenti di TypeScript possono ora dedurre i tipi in base al tuo React.PropTypes( PropTypes.InferProps), ma i tipi risultanti possono essere difficili da usare o fare riferimento altrove nel tuo codice.


1
Potresti spiegare la prima affermazione?
vehsakul

2
@vehsakul Spiacenti, per chiarimenti, se stai scrivendo un pacchetto che verrà installato da sviluppatori che non utilizzano TypeScript, hanno comunque bisogno di PropTypes per ottenere errori in fase di esecuzione. Se il tuo progetto è solo per te / altri progetti TypeScript, le interfacce TypeScript per i tuoi oggetti di scena sono sufficienti perché il progetto semplicemente non verrà costruito.
Joel Day

1
Questo è un POC che aggiunge PropTypes da interfacce dattiloscritte a livello Webpack github.com/grncdr/ts-react-loader#what-it-does
borN_free

Voglio un oneOfType - optionalUnion: PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanceOf (Message)]), - il dattiloscritto ha tipi di unione, ma non mi danno esattamente la stessa cosa
Mz Un

1
Ho pubblicato una libreria che fa anche questo: github.com/joelday/ts-proptypes-transformer È implementato come una trasformazione del compilatore TypeScript e produce propTypes accurati per generici profondi, unioni, ecc. Ci sono alcuni bordi approssimativi, quindi qualsiasi contributo sarebbe meraviglioso.
Joel Day

141

Typescript e PropTypes hanno scopi diversi. Typescript convalida i tipi in fase di compilazione , mentre PropTypes viene controllato in fase di esecuzione .

Il typescript è utile quando scrivi codice: ti avviserà se passi un argomento del tipo sbagliato ai tuoi componenti React, ti darà il completamento automatico per le chiamate di funzione, ecc.

I PropTypes sono utili quando testate come i componenti interagiscono con i dati esterni, ad esempio quando caricate JSON da un'API. PropTypes ti aiuterà a eseguire il debug (quando sei in modalità Sviluppo di React) perché il tuo componente non funziona stampando messaggi utili come:

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

Anche se può sembrare che Typescript e PropTypes facciano la stessa cosa, in realtà non si sovrappongono affatto. Ma è possibile generare automaticamente PropTypes da Typescript in modo da non dover specificare due volte i tipi, vedi ad esempio:


1
I tipi propTypes e Typescript non sono più sincronizzati facilmente? Qualcuno ha avuto esperienza di manutenzione da dircelo?
Leonardo

9
Questa è la risposta corretta! PropTypes (run-time) non sono la stessa cosa del controllo del tipo statico (tempo di compilazione). Quindi utilizzare entrambi non è un "esercizio inutile".
hans

1
Ecco una bella spiegazione su come i tipi statici possono essere dedotti da PropTypes: dev.to/busypeoples/…
hans

Il tempo di runtime e il tempo di compilazione non hanno senso quando hai vue cli con hot reload ed eslint. Che genera errori durante il salvataggio.
Julia

1
@ Julia, hot reload non ha nulla in comune con il runtime. Anche con hot reload non avrai idea di cosa verrà veramente restituito da api
Kostya Tresko

4

Immagino che in alcune situazioni disordinate in cui il tipo di oggetti di scena non può essere dedotto in fase di compilazione, sarebbe utile vedere eventuali avvisi generati dall'utilizzo propTypesin fase di esecuzione.

Una di queste situazioni potrebbe verificarsi durante l'elaborazione dei dati da un'origine esterna per la quale le definizioni del tipo non sono disponibili, ad esempio un'API esterna al di fuori del tuo controllo. Per le API interne, penso che valga la pena scrivere (o meglio, generare) definizioni di tipo, se non sono già disponibili.

A parte questo, non vedo alcun vantaggio (motivo per cui non l'ho mai usato personalmente).


7
La convalida di PropTypes ha senso anche per convalidare le strutture di dati caricate dinamicamente (provenienti dal server tramite AJAX). PropTypes è la convalida del runtime e quindi può davvero aiutare a eseguire il debug delle cose. Poiché i problemi produrranno messaggi chiari e amichevoli.
e1v
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.