TypeScript Academy · पाठ

पॉलीमॉर्फ़िक कंपोनेंट; as प्रॉप्स

as प्रॉप वाले पॉलीमॉर्फ़िक Button कंपोनेंट बनाएँ; intrinsic/DOM प्रॉप्स मिलाएँ; forwardRef और ComponentRef से refs का प्रकार लिखें।

पाठ 1, कुल 1 में से8 चरण

पॉलीमॉर्फ़िक कंपोनेंट; as प्रॉप्स, CoddyKit पर TypeScript Academy का एक निःशुल्क पाठ है। यह 1 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह TypeScript Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। TypeScript Academy पाठ्यक्रम में कुल 1 पाठ शामिल हैं।

परिचय

लक्ष्य: एक ऐसा बहुरूपी Button बनाएँ जो button, a या as प्रॉप के ज़रिए किसी भी एलिमेंट के रूप में रेंडर हो सके—और प्रॉप्स व रेफ़ के प्रकार बनाए रखे।

  • T को React.ElementType तक सीमित करें
  • प्रॉप्स को सुरक्षित रूप से मिलाएँ
  • फ़ॉरवर्ड किए गए रेफ़ का प्रकार तय करें

आधार प्रकार

OwnProps से शुरू करें और PolymorphicProps<T, P> जैसी यूटिलिटी का उपयोग करें, जो T के मूल प्रॉप्स को आपके प्रॉप्स के साथ मिला दे।

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

घटक का डिफ़ॉल्ट button होता है, लेकिन यह as स्वीकार करता है। रेफ़ का प्रकार T के साथ बदलता है (जैसे, "a" के लिए HTMLAnchorElement)।

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

उपयोग के उदाहरण

जब as="a" हो, तो href जैसे मूल प्रॉप्स उपलब्ध हो जाते हैं और रेफ़ का प्रकार 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>
  )
}

रूपांतर

आप बहुरूपी घटक को रैप करके भी उसका लचीलापन बनाए रख सकते हैं। उसके प्रॉप्स विरासत में लेने के लिए ComponentProps<typeof Button> का उपयोग करें।

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>
  )
}

सुझाव

सुझाव:

  • T को React.ElementType तक सीमित करें।
  • प्रॉप नामों के टकराव सुलझाने के लिए Omit का उपयोग करें।
  • forwardRef से रेफ़ फ़ॉरवर्ड करें और उसका प्रकार React.ComponentRef<T> रखें।

बहुरूपी टाइपिंग जाँच

त्वरित जाँच: रेफ़ फ़ॉरवर्ड करने वाले बहुरूपी घटक का सही मॉडल कौन-सी टाइपिंग बनाती है?

पुनरावलोकन

पुनरावलोकन: आपने as प्रॉप वाला बहुरूपी Button बनाया, मूल प्रॉप्स को सुरक्षित रूप से मिलाया और फ़ॉरवर्ड किए गए रेफ़ का प्रकार तय किया, ताकि उपयोगकर्ताओं को सही इंटेलिसेंस मिले।

शुरुआत निःशुल्क

एआई शिक्षक के साथ TypeScript सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
101
पाठ
352

अक्सर पूछे जाने वाले प्रश्न

क्या “पॉलीमॉर्फ़िक कंपोनेंट; as प्रॉप्स” पाठ निःशुल्क है?

हाँ—“पॉलीमॉर्फ़िक कंपोनेंट; as प्रॉप्स” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और TypeScript Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। TypeScript Academy पाठ्यक्रम में कुल 1 पाठ शामिल हैं।

“पॉलीमॉर्फ़िक कंपोनेंट; as प्रॉप्स” में मैं क्या सीखूँगा?

as प्रॉप वाले पॉलीमॉर्फ़िक Button कंपोनेंट बनाएँ; intrinsic/DOM प्रॉप्स मिलाएँ; forwardRef और ComponentRef से refs का प्रकार लिखें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ TypeScript Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या TypeScript Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर TypeScript Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 1 में से 1वाँ पाठ है।

“पॉलीमॉर्फ़िक कंपोनेंट; as प्रॉप्स” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस TypeScript Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर TypeScript Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

← TypeScript Academy पर वापस जाएँ