PropTypes w aplikacji reagującej na język TypeScript

121

Czy używanie React.PropTypesma sens w aplikacji TypeScript React, czy jest to tylko przypadek „paska i szelek”?

Ponieważ klasa komponentu jest zadeklarowana za pomocą Propsparametru typu:

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

czy jest realna korzyść z dodania

static propTypes {
    myProp: React.PropTypes.string
}

do definicji klasy?

Ralph
źródło

Odpowiedzi:

104

Utrzymywanie obu React.PropTypeswłaściwości komponentów jako typów TypeScript i w tym samym czasie nie ma zwykle dużej wartości .

Oto kilka przypadków, w których warto to zrobić:

  • Publikowanie pakietu, takiego jak biblioteka komponentów, która będzie używana przez zwykły JavaScript.
  • Akceptowanie i przekazywanie zewnętrznych danych wejściowych, takich jak wyniki wywołania interfejsu API.
  • Korzystanie z danych z biblioteki, która może nie zawierać adekwatnych lub dokładnych typów pisma, jeśli takie istnieją.

Zwykle jest to kwestia tego, jak bardzo możesz ufać sprawdzaniu poprawności w czasie kompilacji.

Nowsze wersje języka TypeScript mogą teraz wywnioskować typy na podstawie Twojej React.PropTypes( PropTypes.InferProps), ale typy wynikowe mogą być trudne w użyciu lub odwoływaniu się do innego miejsca w kodzie.

Joel Day
źródło
1
Czy mógłbyś wyjaśnić pierwsze stwierdzenie?
Vehsakul
2
@vehsakul Przepraszamy, dla wyjaśnienia, jeśli piszesz pakiet, który zostanie zainstalowany przez programistów, którzy nie używają TypeScript, nadal potrzebują PropTypes, aby otrzymywać błędy w czasie wykonywania. Jeśli twój projekt jest tylko dla ciebie / innych projektów TypeScript, interfejsy TypeScript dla twoich rekwizytów są wystarczające, ponieważ projekt po prostu się nie zbuduje.
Joel Day
1
To jest POC, który dodaje PropTypes z interfejsów maszynopisu na poziomie pakietu
Webpack
Chcę oneOfType - optionalUnion: PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanceOf (Message)]), - maszynopis ma typy unii, ale nie dają mi tego samego
Mz
1
Opublikowałem bibliotekę, która również to robi: github.com/joelday/ts-proptypes-transformer Jest zaimplementowana jako transformacja kompilatora TypeScript i tworzy dokładne typy właściwości propTyp dla głębokich typów ogólnych, związków itp. Istnieją pewne nierówne krawędzie, więc każdy wkład byłby wspaniały.
Dzień Joela
141

Typescript i PropTypes służą różnym celom. Typescript sprawdza poprawność typów w czasie kompilacji , podczas gdy PropTypes są sprawdzane w czasie wykonywania .

Typescript jest przydatny podczas pisania kodu: ostrzeże Cię, jeśli przekażesz argument niewłaściwego typu do komponentów Reacta, da ci autouzupełnianie dla wywołań funkcji itp.

PropTypes są przydatne podczas testowania interakcji komponentów z danymi zewnętrznymi, na przykład podczas ładowania JSON z interfejsu API. PropTypes pomoże ci zdebugować (w trybie programistycznym React), dlaczego twój komponent nie działa, drukując pomocne komunikaty, takie jak:

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

Chociaż może się wydawać, że Typescript i PropTypes robią to samo, w rzeczywistości wcale się nie pokrywają. Ale możliwe jest automatyczne generowanie PropTypes z Typescript, dzięki czemu nie musisz dwukrotnie określać typów, zobacz na przykład:

afonsoduarte
źródło
1
Czy typy propTypes i Typescript łatwo tracą synchronizację? Czy ktoś miał doświadczenie w konserwacji, aby nam o tym powiedzieć?
Leonardo
9
To jest poprawna odpowiedź! PropTypes (run-time) to nie to samo, co statyczne sprawdzanie typów (czas kompilacji). Dlatego używanie obu nie jest „bezcelowym ćwiczeniem”.
hans
1
Oto ładne wyjaśnienie, w jaki sposób można wywnioskować typy statyczne z PropTypes: dev.to/busypeoples/ ...
hans
Czas wykonania a czas kompilacji nie ma sensu, gdy masz vue cli z gorącym przeładowaniem i eslintem. Co generuje błędy przy zapisywaniu.
Julia
1
@Julia, gorące przeładowanie nie ma nic wspólnego ze środowiskiem uruchomieniowym. Nawet przy gorącym przeładowaniu nie będziesz miał pojęcia, co naprawdę zwróci api
Kostya Tresko
4

Wydaje mi się, że w niektórych niechlujnych sytuacjach, w których nie można wywnioskować typu właściwości w czasie kompilacji, przydatne byłoby zobaczenie wszelkich ostrzeżeń wygenerowanych podczas używania propTypesw czasie wykonywania.

Jedną z takich sytuacji może być przetwarzanie danych z zewnętrznego źródła, dla którego definicje typów nie są dostępne, na przykład zewnętrzny interfejs API pozostający poza Twoją kontrolą. Myślę, że w przypadku wewnętrznych API warto napisać (lub lepiej wygenerować) definicje typów, jeśli nie są one jeszcze dostępne.

Poza tym nie widzę żadnych korzyści (dlatego nigdy nie korzystałem z niego osobiście).

Tom Fenech
źródło
7
Walidacja PropTypes ma również sens, aby walidować dynamicznie ładowane struktury danych (pochodzące z serwera przez AJAX). PropTypes to walidacja w czasie wykonywania, a zatem może naprawdę pomóc w debugowaniu rzeczy. Ponieważ problemy przyniosą jasne i przyjazne dla człowieka komunikaty.
e1v