Tôi hiện đang chuyển một ứng dụng React sang TypeScript. Cho đến nay, điều này hoạt động khá tốt, nhưng tôi gặp vấn đề với các kiểu trả về của các renderhàm tương ứng với các thành phần hàm của tôi.
Từ trước đến nay, tôi luôn sử dụng JSX.Elementlàm kiểu trả về, bây giờ điều này không hoạt động nữa nếu một thành phần quyết định không hiển thị bất kỳ thứ gì, tức là trả về null, vì nullkhông có giá trị hợp lệ cho JSX.Element. Đây là sự khởi đầu của cuộc hành trình của tôi, bởi vì bây giờ tôi đã tìm kiếm trên web và thấy rằng bạn nên sử dụng ReactNodethay thế, điều này cũng bao gồm nullvà một vài thứ khác có thể xảy ra. Đây dường như là một cuộc đặt cược tốt hơn.
Tuy nhiên, bây giờ khi tạo một thành phần chức năng, TypeScript phàn nàn về ReactNodekiểu. Một lần nữa, sau một số tìm kiếm, tôi đã tìm thấy rằng đối với các thành phần chức năng, bạn nên sử dụng ReactElementthay thế. Tuy nhiên, nếu tôi làm như vậy, vấn đề tương thích đã biến mất, nhưng bây giờ TypeScript lại phàn nàn về việc nullkhông phải là giá trị hợp lệ.
Vì vậy, để cắt ngắn một câu chuyện dài, tôi có ba câu hỏi:
- Sự khác biệt giữa
JSX.Element,ReactNodevà làReactElementgì? - Tại sao các
renderphương thức của các thành phần lớp trả vềReactNode, nhưng các thành phần hàm lại trả vềReactElement? - Làm cách nào để giải quyết vấn đề này
null?
class Example extends Component<ExampleProps> {đối với các lớp vàconst Example: FunctionComponent<ExampleProps> = (props) => {các thành phần chức năng (đâuExamplePropslà giao diện cho các đạo cụ dự kiến). Và sau đó các kiểu này có đủ thông tin mà kiểu trả về có thể được suy ra.