PropTypes trong một ứng dụng phản ứng TypeScript


121

Việc sử dụng React.PropTypescó hợp lý trong Ứng dụng TypeScript React hay đây chỉ là trường hợp "dây đai và dây treo"?

Vì lớp thành phần được khai báo với một Propstham số kiểu:

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

có lợi ích thực sự nào khi thêm

static propTypes {
    myProp: React.PropTypes.string
}

định nghĩa lớp?

Câu trả lời:


104

Thường không có nhiều giá trị để duy trì đồng thời cả hai đạo cụ thành phần của bạn dưới dạng các loại TypeScript React.PropTypes.

Dưới đây là một số trường hợp hữu ích khi làm như vậy:

  • Xuất bản một gói chẳng hạn như một thư viện thành phần sẽ được sử dụng bởi JavaScript thuần túy.
  • Chấp nhận và chuyển đầu vào bên ngoài, chẳng hạn như kết quả từ lệnh gọi API.
  • Sử dụng dữ liệu từ một thư viện có thể không có các cách đánh máy đầy đủ hoặc chính xác, nếu có.

Vì vậy, thường là một câu hỏi về mức độ bạn có thể tin tưởng vào xác thực thời gian biên dịch của mình.

Các phiên bản TypeScript mới hơn hiện có thể suy ra các loại dựa trên React.PropTypes( PropTypes.InferProps) của bạn , nhưng các loại kết quả có thể khó sử dụng hoặc tham chiếu đến nơi khác trong mã của bạn.


1
Bạn có thể vui lòng giải thích tuyên bố đầu tiên?
vehsakul

2
@vehsakul Xin lỗi, để làm rõ, nếu bạn đang viết một gói sẽ được cài đặt bởi các nhà phát triển không sử dụng TypeScript, họ vẫn cần PropTypes để gặp lỗi trong thời gian chạy. Nếu dự án của bạn chỉ dành cho chính bạn / các dự án TypeScript khác, thì các giao diện TypeScript cho đạo cụ của bạn là đủ vì đơn giản là dự án sẽ không xây dựng.
Ngày Joel

1
Đây là một POC bổ sung PropTypes từ giao diện typecript trên Webpack cấp github.com/grncdr/ts-react-loader#what-it-does
borN_free

Tôi muốn một oneOfType - optionUnion: PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanceOf (Message)]), - typecript có các kiểu liên hợp, nhưng chúng không hoàn toàn mang lại cho tôi điều tương tự
Mz A

1
Tôi đã xuất bản một thư viện thực hiện điều này: github.com/joelday/ts-proptypes-transformer Nó được triển khai dưới dạng biến đổi trình biên dịch TypeScript và nó tạo ra propTypes chính xác cho các generic sâu, liên hiệp, v.v. Có một số cạnh thô, vì vậy bất kỳ đóng góp sẽ là tuyệt vời.
Ngày Joel

139

Typecript và PropTypes phục vụ các mục đích khác nhau. Typecript xác thực các kiểu tại thời điểm biên dịch , trong khi PropTypes được kiểm tra trong thời gian chạy .

Typecript hữu ích khi bạn đang viết mã: nó sẽ cảnh báo bạn nếu bạn chuyển đối số không đúng loại cho các thành phần React của mình, cung cấp cho bạn tính năng tự động hoàn thành cho các lệnh gọi hàm, v.v.

PropTypes hữu ích khi bạn kiểm tra cách các thành phần tương tác với dữ liệu bên ngoài, chẳng hạn như khi bạn tải JSON từ một API. PropTypes sẽ giúp bạn gỡ lỗi (khi ở chế độ Phát triển của React) tại sao thành phần của bạn bị lỗi bằng cách in các thông báo hữu ích như:

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

Mặc dù có vẻ như Typecript và PropTypes làm điều tương tự, nhưng chúng không thực sự trùng lặp chút nào. Nhưng có thể tự động tạo PropTypes từ Typescript để bạn không phải chỉ định loại hai lần, hãy xem ví dụ:


1
Các loại propTypes và Typescript có dễ dàng bị mất đồng bộ không? Có ai đã có kinh nghiệm bảo trì cho chúng tôi biết?
Leonardo

9
Đây là câu trả lời chính xác! PropTypes (thời gian chạy) không giống như kiểm tra kiểu tĩnh (thời gian biên dịch). Do đó, sử dụng cả hai không phải là một 'bài tập vô nghĩa'.
hans

1
Dưới đây là một lời giải thích hay về cách các kiểu tĩnh có thể được suy ra từ PropTypes: dev.to/busype People's/
hans,

Thời gian chạy và thời gian biên dịch không có ý nghĩa khi bạn có vue cli với tải lại nóng và eslint. Điều này tạo ra lỗi khi lưu.
Julia

1
@Julia, tải lại nóng không có điểm chung nào với thời gian chạy. Ngay cả khi tải lại nóng, bạn sẽ không có manh mối gì sẽ thực sự được api trả lại
Kostya Tresko

4

Tôi đoán rằng trong một số tình huống lộn xộn mà loại đạo cụ không thể được suy ra tại thời điểm biên dịch, thì sẽ hữu ích khi xem bất kỳ cảnh báo nào được tạo ra từ việc sử dụng propTypestrong thời gian chạy.

Một tình huống như vậy sẽ xảy ra khi xử lý dữ liệu từ nguồn bên ngoài mà định nghĩa loại không có sẵn, chẳng hạn như API bên ngoài ngoài tầm kiểm soát của bạn. Đối với các API nội bộ, tôi nghĩ rằng rất đáng để nỗ lực viết (hoặc tốt hơn là tạo) các định nghĩa loại, nếu chúng chưa có sẵn.

Ngoài ra, tôi không thực sự thấy bất kỳ lợi ích nào (mà tôi tại sao tôi chưa bao giờ sử dụng nó một cách cá nhân).


7
Xác thực PropTypes cũng có ý nghĩa xác thực cấu trúc dữ liệu được tải một cách khó hiểu (đến từ máy chủ thông qua AJAX). PropTypes là xác thực thời gian chạy và do đó thực sự có thể giúp gỡ lỗi nội dung. Khi có vấn đề sẽ xuất ra các thông điệp rõ ràng và thân thiện với con người.
e1v
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.