Saya memiliki komponen fungsional yang sangat sederhana sebagai berikut:
import * as React from 'react';
export interface AuxProps {
children: React.ReactNode
}
const aux = (props: AuxProps) => props.children;
export default aux;
Dan komponen lainnya:
import * as React from "react";
export interface LayoutProps {
children: React.ReactNode
}
const layout = (props: LayoutProps) => (
<Aux>
<div>Toolbar, SideDrawer, Backdrop</div>
<main>
{props.children}
</main>
<Aux/>
);
export default layout;
Saya terus mendapatkan kesalahan berikut:
[ts] Jenis elemen JSX 'ReactNode' bukanlah fungsi konstruktor untuk elemen JSX. Ketik 'undefined' tidak dapat digunakan untuk mengetik 'ElementClass'. [2605]
Bagaimana cara saya mengetik ini dengan benar?
reactjs
typescript
jsx
typescript2.0
Asool
sumber
sumber
JSX.Element
tidak cukup baik karena anak-anak React yang valid dapat berupa string, boolean, null ...ReactChild
juga tidak lengkap karena alasan yang samaReactNode
. Itu tidak membantu dalam hal keamanan tipe, mirip dengan mengetikchildren
sebagaiany
- lihat jawaban saya untuk penjelasan.Untuk dapat digunakan
<Aux>
di JSX Anda, ini harus berupa fungsi yang mengembalikanReactElement<any> | null
. Itulah definisi komponen fungsi .Namun, saat ini didefinisikan sebagai fungsi yang mengembalikan
React.ReactNode
, yang merupakan tipe yang jauh lebih luas. Seperti yang dikatakan pengetikan React:Pastikan tipe yang tidak diinginkan dinetralkan dengan membungkus nilai yang dikembalikan ke dalam React Fragment (
<></>
):sumber
children
dalam Fragmen React. Mau menjelaskan? Di React, ini sangat valid untuk hanyareturn children;
.children
adalah sebuah array. Jika demikian, Anda perlu membungkusnya dalam satu node atau menggunakan React Fragments.return React.Children.count(children) > 1 ? <>{children}</> : children
:, tapi naskah ketikan mengeluh tentang itu. Saya menggantinya dengan hanya<>{children}</>
.children
merupakan daftar elemen yang kebetulan hanya berisi 1 item. Saya pikir itu akan berhasil jika Anda melakukannyareturn React.Children.count(children) > 1 ? <>{children}</> : children[0]
@sanfilippopablo<React.Fragment>
sekitarnya{props.children}
saya tidak mengembalikan apa pun.Inilah yang berhasil untuk saya:
Edit Saya akan merekomendasikan menggunakan
children: React.ReactNode
sebagai gantinya sekarang.sumber
<MyComponent>{ condition ? <span>test</span> : null}</MyComponent>
. Menggunakanchildren: ReactNode
akan berhasil.Anda dapat mendeklarasikan komponen Anda seperti ini:
sumber
Anda dapat menggunakan
ReactChildren
danReactChild
:sumber
Dari situs TypeScript: https://github.com/Microsoft/TypeScript/issues/6471
Itu berhasil untuk saya. Node anak dapat terdiri dari banyak hal, jadi pengetikan eksplisit dapat melewatkan kasus.
Ada diskusi yang lebih panjang tentang masalah tindak lanjut di sini: https://github.com/Microsoft/TypeScript/issues/13618 , tetapi pendekatan apa pun masih berfungsi.
sumber
Jenis pengembalian komponen fungsi terbatas
JSXElement | null
pada TypeScript. Ini adalah batasan tipe saat ini, React murni memungkinkan lebih banyak tipe pengembalian.Cuplikan demonstrasi minimal
Anda dapat menggunakan pernyataan tipe atau Fragmen sebagai solusi:
ReactNode
children: React.ReactNode
mungkin suboptimal, jika tujuannya adalah untuk memiliki tipe yang kuatAux
.Hampir semua hal dapat ditetapkan ke
ReactNode
tipe saat ini , yang setara dengan{} | undefined | null
. Jenis yang lebih aman untuk casing Anda bisa jadi:Contoh:
Mengingat
Aux
kebutuhan elemen React sepertichildren
, kami secara tidak sengaja menambahkan astring
ke dalamnya. Maka solusi di atas akan salah berbeda denganReactNode
- lihatlah taman bermain yang terhubung.Diketik
children
juga berguna untuk props non-JSX, seperti callback Render Prop .sumber
Anda juga bisa menggunakan
React.PropsWithChildren<P>
.sumber
Cara umum untuk menemukan tipe apa pun adalah dengan contoh. Keindahan dari naskah ketikan adalah Anda memiliki akses ke semua jenis, selama Anda memiliki
@types/
file yang benar .Untuk menjawab ini sendiri, saya hanya memikirkan penggunaan reaksi komponen yang memiliki
children
prop. Hal pertama yang terlintas dalam pikiran? Bagaimana dengan a<div />
?Yang perlu Anda lakukan hanyalah membuka vscode dan membuat
.tsx
file baru dalam proyek react dengan@types/react
.Melayang di atas
children
penyangga menunjukkan jenisnya. Dan apa yang Anda ketahui - Jenisnya adalahReactNode
(tidak perluReactNode[]
).Kemudian jika Anda mengklik definisi tipe, Anda akan langsung menuju definisi yang
children
berasal dariDOMAttributes
antarmuka.sumber
Sebagai tipe yang berisi anak-anak, saya menggunakan:
Jenis penampung anak ini cukup umum untuk mendukung semua kasus yang berbeda dan juga selaras dengan API ReactJS.
Jadi, untuk contoh Anda, itu akan menjadi seperti ini:
sumber
Jawaban ini tampaknya sudah usang - React sekarang memiliki tipe bawaan
PropsWithChildren<{}>
. Ini didefinisikan serupa dengan beberapa jawaban yang benar di halaman ini:type PropsWithChildren<P> = P & { children?: ReactNode };
sumber
P
kasus tipe itu?P
adalah jenis alat peraga komponen AndaKomponen React harus memiliki node pembungkus tunggal atau mengembalikan array node.
Anda
<Aux>...</Aux>
Komponen memiliki dua nodediv
danmain
.Cobalah untuk membungkus anak Anda dalam
div
diAux
komponen.sumber