ค้นหาเว็บไซต์

javascript - วิธีการส่ง props ที่เป็นตัวเลือกแบบมีเงื่อนไขไปยังคอมโพเนนต์เมื่อเราใช้ React กับ Typescript?


เมื่อเราใช้ React กับ Typescript เราสามารถกำหนด props แบบไม่บังคับได้:

interface SomeProps {
  required: string
  optional?: number
}

const SomeComponent = ({ required, optional }: SomeProps): JSX.Element => { ...

เมื่อเราใช้มันในภายหลัง เราสามารถส่งผ่านหรือเว้นคุณสมบัติที่เป็นทางเลือกได้:

<SomeComponent required="abc" />
<SomeComponent required="def" optional={1} />

เมื่อเราต้องการทำสิ่งนั้นแบบไดนามิกด้วย React โดยไม่ใช้ Typescript เราสามารถส่งค่า undefined ให้กับคุณสมบัติเชิงเลือกได้:

<SomeComponent required="ghi" optional={optionalValue ? optionalValue : undefined } />

แต่กับ Typescript วิธีนั้นใช้ไม่ได้ ตัวแปลง Typescript จะแจ้งเตือนเราว่าชนิด number | undefined ไม่สามารถกำหนดค่าให้กับ number ได้ แน่นอนว่าเราสามารถห่อมันด้วยคำสั่ง if และใช้ SomeComponent ซ้ำได้ แต่ก็ไม่ใช่วิธีที่สวยงามที่สุด...

เราสามารถส่ง props แบบเลือกได้ไปยังคอมโพเนนต์แบบมีเงื่อนไขเมื่อเราใช้ React กับ Typescript ได้อย่างไร?

อัปเดต

ขออภัยครับ ผมผิด วิธีนี้แน่นอนว่าทำงานได้กับ Typescript ด้วย ผมไม่ได้สังเกตบางส่วนภายในโค้ดของผม (ซึ่งไม่ได้เป็นส่วนหนึ่งของคำถาม)

คำตอบ #1

import React from 'react'

interface SomeProps {
  required: string
  optional?: number
}

const SomeComponent = ({ required, optional }: SomeProps) => null

const x = <SomeComponent required="abc" />
const y = <SomeComponent required="def" optional={1} />

const Foo = (optional?: number) =>
  <SomeComponent required="ghi" optional={optional ? optional : undefined} />

มันใช้งานได้ใน Playground

คำตอบ #2

คุณสามารถเพิ่มหลายประเภทสำหรับ prop optional ได้ ในกรณีของคุณ ประเภทที่เป็นไปได้คือ number และ undefined ดังนั้นคุณสามารถกำหนด prop optional ได้ดังนี้:

interface SomeProps {
      required: string
      optional?: number | undefined
    }