0Pricing
TypeScript Academy · Pelajaran

Komponen polimorfik; props as

Bangun komponen Button polimorfik dengan props as; gabungkan props intrinsik/DOM; ketik refs menggunakan forwardRef dan ComponentRef .

Komponen polimorfik; props as adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 1. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 1 pelajaran total.

Pendahuluan

Tujuan: Bangun satu Button polimorfik yang dapat dirender sebagai button, a, atau elemen apa pun melalui properti as—dengan tetap mempertahankan tipe properti dan referensi.

  • Batasi T ke React.ElementType
  • Gabungkan properti dengan aman
  • Beri tipe pada referensi yang diteruskan

Tipe dasar

Mulailah dengan OwnProps dan utilitas PolymorphicProps<T, P> yang menggabungkan properti bawaan untuk T dengan properti Anda sendiri.

import React from "react"

type OwnProps = {
  variant?: "solid" | "outline"
  children: React.ReactNode
}

type PolymorphicProps<T extends React.ElementType, P> = {
  as?: T
} & P & Omit<React.ComponentPropsWithoutRef<T>, keyof P | "as">

// Example: Omit avoids prop collisions (e.g., our OwnProps vs intrinsic props)

Button polimorfik

Komponen secara bawaan menggunakan button, tetapi menerima as. Tipe referensi berubah sesuai T (misalnya, HTMLAnchorElement untuk "a").

import React, { forwardRef } from "react"

type OwnProps = { variant?: "solid" | "outline"; children: React.ReactNode }

type PolymorphicProps<T extends React.ElementType, P> = { as?: T } & P & Omit<React.ComponentPropsWithoutRef<T>, keyof P | "as">

const ButtonInner = <T extends React.ElementType = "button">(
  { as, variant = "solid", children, ...rest }: PolymorphicProps<T, OwnProps>,
  ref: React.ForwardedRef<React.ComponentRef<T>>
) => {
  const Component = (as || "button") as React.ElementType
  const style = variant === "outline" ? { border: "1px solid #333", padding: 8 } : { background: "#2563eb", color: "white", padding: 8, borderRadius: 6 }
  return <Component ref={ref} style={style} {...rest}>{children}</Component>
}

export const Button = forwardRef(ButtonInner) as <T extends React.ElementType = "button">(
  props: PolymorphicProps<T, OwnProps> & { ref?: React.Ref<React.ComponentRef<T>> }
) => JSX.Element

Contoh penggunaan

Saat as="a", properti bawaan seperti href tersedia dan referensi diberi tipe HTMLAnchorElement.

import React, { useRef } from "react"
import { Button } from "./Button"

export default function App() {
  const btnRef = useRef<HTMLButtonElement>(null)
  const linkRef = useRef<HTMLAnchorElement>(null)

  return (
    <div style={{ display: "grid", gap: 8 }}>
      <Button ref={btnRef} onClick={() => alert("clicked")}>Save</Button>
      <Button as="a" ref={linkRef} href="#docs" variant="outline">Docs</Button>
    </div>
  )
}

Varian

Anda dapat membungkus komponen polimorfik dan tetap mempertahankan fleksibilitasnya. Gunakan ComponentProps<typeof Button> untuk mewarisi propertinya.

import React from "react"
import { Button } from "./Button"

export function DangerButton(props: Omit<React.ComponentProps<typeof Button>, "variant">) {
  return <Button {...props} style={{ background: "#dc2626", color: "white", padding: 8, borderRadius: 6 }} />
}

// Works with polymorphism too
export default function App() {
  return (
    <div style={{ display: "grid", gap: 8 }}>
      <DangerButton>Delete</DangerButton>
      <DangerButton as="a" href="#confirm">Delete link</DangerButton>
    </div>
  )
}

Kiat

Kiat:

  • Batasi T ke React.ElementType.
  • Gunakan Omit untuk mengatasi benturan nama properti.
  • Teruskan referensi dengan forwardRef dan beri tipe sebagai React.ComponentRef<T>.

Pemeriksaan pengetikan polimorfik

Pemeriksaan cepat: Pengetikan mana yang memodelkan komponen polimorfik yang meneruskan referensinya dengan benar?

Ringkasan

Ringkasan: Anda membangun Button polimorfik dengan properti as, menggabungkan properti bawaan dengan aman, dan memberi tipe pada referensi yang diteruskan agar pemanggil mendapatkan pelengkapan kode yang benar.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Komponen polimorfik; props as” gratis?

Ya — teks lengkap “Komponen polimorfik; props as” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 1 pelajaran total.

Apa yang akan aku pelajari di “Komponen polimorfik; props as”?

Bangun komponen Button polimorfik dengan props as; gabungkan props intrinsik/DOM; ketik refs menggunakan forwardRef dan ComponentRef . Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai TypeScript Academy?

Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 1.

Berapa lama pelajaran “Komponen polimorfik; props as” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

← Kembali ke TypeScript Academy