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 render
hà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.Element
là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ì null
khô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 ReactNode
thay thế, điều này cũng bao gồm null
và 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ề ReactNode
kiể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 ReactElement
thay 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 null
khô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
,ReactNode
và làReactElement
gì? - Tại sao các
render
phươ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 (đâuExampleProps
là 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.