Saya tidak tahu bagaimana cara menetapkan nilai properti default untuk komponen saya menggunakan Typecript.
Ini adalah kode sumber:
class PageState
{
}
export class PageProps
{
foo: string = "bar";
}
export class PageComponent extends React.Component<PageProps, PageState>
{
public render(): JSX.Element
{
return (
<span>Hello, world</span>
);
}
}
Dan ketika saya mencoba menggunakan komponen seperti ini:
ReactDOM.render(<PageComponent />, document.getElementById("page"));
Saya mendapatkan pesan kesalahan yang mengatakan bahwa properti foo
tidak ada. Saya ingin menggunakan nilai default. Saya juga mencoba menggunakan static defaultProps = ...
di dalam komponen, tetapi tidak memiliki efek seperti yang saya duga.
src/typescript/main.tsx(8,17): error TS2324: Property 'foo' is missing in type 'IntrinsicAttributes & IntrinsicClassAttributes<PageComponent> & PageProps & { children?: ReactEle...'.
Bagaimana saya bisa menggunakan nilai properti default? Banyak komponen JS yang digunakan perusahaan saya bergantung padanya dan tidak menggunakannya bukanlah pilihan.
reactjs
typescript
tsx
Tom
sumber
sumber
static defaultProps
benar. Bisakah Anda memposting kode itu?Jawaban:
Alat peraga bawaan dengan komponen kelas
Penggunaannya
static defaultProps
benar. Anda juga harus menggunakan antarmuka, bukan kelas, untuk alat peraga dan negara.Pembaruan 2018/12/1 : TypeScript telah meningkatkan pemeriksaan tipe yang terkait dengan
defaultProps
waktu. Baca terus untuk penggunaan terbaru dan terhebat hingga penggunaan dan masalah yang lebih lama.Untuk TypeScript 3.0 dan lebih tinggi
TypeScript secara khusus menambahkan dukungan untuk
defaultProps
membuat pemeriksaan jenis berfungsi seperti yang Anda harapkan. Contoh:Yang dapat dirender dan dikompilasi tanpa melewati
foo
atribut:Perhatikan bahwa:
foo
adalah tidak ditandai opsional (yaitufoo?: string
) meskipun itu tidak diperlukan sebagai atribut BEJ. Menandai sebagai opsional berarti bahwa itu bisa sajaundefined
, tetapi sebenarnya tidak akan pernahundefined
karenadefaultProps
memberikan nilai default. Anggap saja mirip dengan bagaimana Anda dapat menandai parameter fungsi opsional, atau dengan nilai default, tetapi tidak keduanya, namun keduanya berarti panggilan tidak perlu menentukan nilai . TypeScript 3.0+ memperlakukandefaultProps
dengan cara yang serupa, yang sangat keren untuk pengguna Bereaksi!defaultProps
memiliki anotasi jenis eksplisit. Jenisnya disimpulkan dan digunakan oleh kompiler untuk menentukan atribut JSX mana yang diperlukan. Anda bisa menggunakandefaultProps: Pick<PageProps, "foo">
untuk memastikandefaultProps
kecocokan sub-set dariPageProps
. Lebih lanjut tentang peringatan ini dijelaskan di sini .@types/react
versi16.4.11
untuk berfungsi dengan baik.Untuk TypeScript 2.1 hingga 3.0
Sebelum TypeScript 3.0 menerapkan dukungan kompiler untuk
defaultProps
Anda masih bisa memanfaatkannya, dan itu bekerja 100% dengan Bereaksi pada saat runtime, tetapi karena TypeScript hanya mempertimbangkan alat peraga ketika memeriksa atribut JSX Anda harus menandai alat peraga yang memiliki standar sebagai opsional dengan?
. Contoh:Perhatikan bahwa:
defaultProps
dengan ituPartial<>
sehingga ketik-cek terhadap alat peraga Anda, tetapi Anda tidak harus menyediakan setiap properti yang diperlukan dengan nilai default, yang tidak masuk akal karena properti yang diperlukan seharusnya tidak pernah membutuhkan default.strictNullChecks
nilaithis.props.foo
akanpossibly undefined
dan membutuhkan pernyataan non-nol (yaituthis.props.foo!
) atau tipe-penjaga (yaituif (this.props.foo) ...
) untuk menghapusundefined
. Ini menjengkelkan karena nilai prop standar berarti sebenarnya tidak akan pernah dapat ditentukan, tetapi TS tidak memahami aliran ini. Itulah salah satu alasan utama TS 3.0 menambahkan dukungan eksplisit untukdefaultProps
.Sebelum TypeScript 2.1
Ini berfungsi sama tetapi Anda tidak memiliki
Partial
jenis, jadi abaikan sajaPartial<>
dan berikan nilai standar untuk semua alat peraga yang diperlukan (meskipun standar itu tidak akan pernah digunakan) atau abaikan anotasi jenis eksplisit sepenuhnya.Alat peraga bawaan dengan Komponen Fungsional
Anda dapat menggunakan
defaultProps
komponen fungsi juga, tetapi Anda harus mengetikkan fungsi Anda ke antarmukaFunctionComponent
(StatelessComponent
dalam@types/react
versi sebelum16.7.2
) sehingga TypeScript tahu tentangdefaultProps
fungsi:Perhatikan bahwa Anda tidak harus menggunakan di
Partial<PageProps>
mana pun karenaFunctionComponent.defaultProps
sudah ditentukan sebagai parsial di TS 2.1+.Alternatif lain yang bagus (ini yang saya gunakan) adalah merusak
props
parameter Anda dan menetapkan nilai default secara langsung:Maka Anda tidak perlu
defaultProps
sama sekali! Sadarilah bahwa jika Anda tidak memberikandefaultProps
pada komponen fungsi itu akan lebih diutamakan daripada nilai parameter default, karena Bereaksi akan selalu secara eksplisit lulusdefaultProps
nilai (sehingga parameter tidak pernah terdefinisi, sehingga parameter default tidak pernah digunakan.) Jadi, Anda akan menggunakan satu atau yang lain, tidak keduanya.sumber
<PageComponent>
suatu tempat tanpa melewatifoo
prop. Anda dapat membuatnya opsional menggunakanfoo?: string
di antarmuka Anda.public static defaultProps
ataustatic defaultProps
(public
default) untuk semuanya (compiler dan React runtime) agar berfungsi dengan baik. Ini dapat bekerja pada saat runtimeprivate static defaultProps
hanya karenaprivate
danpublic
tidak ada saat runtime, tetapi kompiler tidak akan berfungsi dengan benar.Dengan Typescript 2.1+, gunakan Partial <T> alih-alih menjadikan properti antarmuka Anda opsional.
sumber
Dengan Typescript 3.0 ada solusi baru untuk masalah ini:
Perhatikan bahwa untuk bekerja Anda memerlukan versi terbaru dari
@types/react
dari16.4.6
. Ini bekerja dengan16.4.11
.sumber
export interface Props { name?: string;}
mana nama adalah properti opsional ? Saya terus mendapatkanTS2532 Object is possibly 'undefined'
undefined
merupakan semacam nilai default otomatis untuk props tersebut. Anda ingin dapat masukundefined
sebagai nilai eksplisit kadang-kadang, tetapi memiliki nilai default lain? Sudahkah Anda mencobaexport interface Props {name: string | undefined;}
? Belum mencobanya, hanya sebuah ide.?
sama dengan menambahkan|undefined
. Saya ingin melewati prop, dan biarkandefaultProps
menangani kasus itu. Sepertinya ini belum mungkin di TS3. Saya hanya akan menggunakanname!
sintaks yang ditakuti karena saya tahu itu tidak pernahundefined
ketikadefaultProps
diatur. Bagaimanapun, terima kasih!Bagi mereka yang memiliki alat peraga opsional yang membutuhkan nilai default. Kredit di sini :)
sumber
Dari komentar oleh @pamelus pada jawaban yang diterima:
Sebenarnya Anda bisa menggunakan TypeScript pewarisan antarmuka . Kode yang dihasilkan hanya sedikit lebih verbose.
sumber
Untuk komponen fungsional, saya lebih suka menyimpan
props
argumen, jadi inilah solusi saya:sumber
Komponen Fungsional
Sebenarnya, untuk komponen fungsional praktik terbaiknya adalah seperti di bawah ini, saya membuat sampel komponen Spinner:
sumber