React Academy · Ders

Bileşen Varyantları için Ayırt Edici Birleşimler

TypeScript'in geçerli prop birleşimlerini zorunlu kılması için varyant prop'larını ayırt edici birleşimlerle modelleyin.

1. ders / 413 adım

Bileşen Varyantları için Ayırt Edici Birleşimler, CoddyKit'te ücretsiz bir React Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, React Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. React Academy kursu toplamda 4 dersten oluşur.

Varyant Özelliklerinin Sorunu

Farklı kipler için isteğe bağlı özelliklere sahip bir bileşen (örneğin bağlantı veya düğme olabilen bir Button), geçersiz özellik birleşimlerine sahip olabilir. TypeScript, ayırt edici birleşimler olmadan bunları yakalayamaz.

Ayırt Edici Birleşim Nedir?

Ayırt edici birleşim, ortak bir sabit tür alanını (ayırt ediciyi) paylaşan türlerin birleşimidir. TypeScript, bu alanın değerine göre türü daraltır.

type Shape =
  | { kind: 'circle'; radius: number }
  | { kind: 'rectangle'; width: number; height: number };

function area(shape: Shape): number {
  if (shape.kind === 'circle') return Math.PI * shape.radius ** 2;
  return shape.width * shape.height; // TS knows width/height exist here
}

Button ve Bağlantı Varyantı

Her durum için doğru özellikleri zorunlu kılmak üzere polimorfik bir bileşeni as veya variant alanındaki ayırt edici birleşimle modelleyin.

type ButtonProps =
  | { as: 'button'; onClick: () => void; disabled?: boolean; children: React.ReactNode }
  | { as: 'a'; href: string; target?: string; children: React.ReactNode };

function ActionButton(props: ButtonProps) {
  if (props.as === 'button') {
    return <button onClick={props.onClick} disabled={props.disabled}>{props.children}</button>;
  }
  return <a href={props.href} target={props.target}>{props.children}</a>;
}

Uyarı Bileşeni Varyantları

Bir Uyarı'yı her önem türü için farklı zorunlu verilerle modelleyin.

type AlertProps =
  | { type: 'success'; message: string }
  | { type: 'error'; message: string; onRetry: () => void }
  | { type: 'warning'; message: string; details?: string };

function Alert(props: AlertProps) {
  if (props.type === 'error') {
    return (
      <div className="alert error">
        <p>{props.message}</p>
        <button onClick={props.onRetry}>Retry</button>
      </div>
    );
  }
  return <div className={`alert ${props.type}`}>{props.message}</div>;
}

Olay İşleyicilerinde Daraltma

Ayırt edici birleşimler olay güdümlü verilerle de çalışır — durum makineleri veya eylem tabanlı durum için idealdir.

type LoadingState<T> =
  | { status: 'idle' }
  | { status: 'loading' }
  | { status: 'success'; data: T }
  | { status: 'error'; error: Error };

function DataView<T>({ state }: { state: LoadingState<T> }) {
  if (state.status === 'loading') return <Spinner />;
  if (state.status === 'error') return <p>{state.error.message}</p>;
  if (state.status === 'success') return <pre>{JSON.stringify(state.data)}</pre>;
  return null;
}

never ile Kapsamlılık Kontrolleri

Yeni bir birleşim üyesi eklenip işlenmediğinde TypeScript hatası almak için varsayılan dala bir never kontrolü ekleyin.

function assertNever(x: never): never {
  throw new Error('Unhandled case: ' + x);
}

function renderIcon(type: AlertProps['type']) {
  switch (type) {
    case 'success': return <CheckIcon />;
    case 'error': return <XIcon />;
    case 'warning': return <WarnIcon />;
    default: return assertNever(type); // TS error if a case is missing
  }
}

API Yanıtları için Ayırt Edici Birleşimler

Çağıranların dönüştürme yapmadan başarı ve hata yollarını işlemesi için API yanıtı biçimlerini ayırt edici birleşimler olarak modelleyin.

type ApiResult<T> =
  | { ok: true; data: T }
  | { ok: false; error: string; code: number };

async function fetchUser(id: string): Promise<ApiResult<User>> {
  const res = await fetch(`/api/users/${id}`);
  if (!res.ok) return { ok: false, error: 'Not found', code: res.status };
  return { ok: true, data: await res.json() };
}

Daraltma için Tür Koruyucuları

Ayırt edicinin basit bir eşitlik kontrolü olmadığı daha karmaşık senaryolarda birleşimleri daraltmak için özel tür koruyucuları kullanın.

function isSuccess<T>(result: ApiResult<T>): result is { ok: true; data: T } {
  return result.ok === true;
}

const result = await fetchUser('1');
if (isSuccess(result)) {
  console.log(result.data.name); // TS knows data exists
}

İsteğe Bağlı Özellik Yığını Oluşturmaktan Kaçınma

Ayırt edici birleşimler olmadan bileşenler yalnızca belirli birleşimlerde geçerli olan isteğe bağlı özellikleri biriktirir; bu durum kafa karıştırıcıdır ve tür denetiminden yoksundur. Ayırt edici birleşimler imkânsız durumları ortadan kaldırır.

// Bad: optional prop soup — invalid combos allowed:
interface BadProps {
  href?: string;
  onClick?: () => void;
  disabled?: boolean;
}

// Good: only valid combos via discriminated union:
type GoodProps =
  | { as: 'a'; href: string }
  | { as: 'button'; onClick: () => void; disabled?: boolean };

Birleşimleri Birleştirme

Birleşimin tüm üyelerine ortak özellikler eklemek için & (kesişim) kullanın.

type BaseProps = { className?: string; children: React.ReactNode };

type ButtonVariant =
  | (BaseProps & { variant: 'primary'; onClick: () => void })
  | (BaseProps & { variant: 'link'; href: string });

Çalışma Zamanında Ayırt Etme

React, doğru kullanıcı arayüzünü oluşturmak için çalışma zamanında ayırt ediciyi kullanır. TypeScript, doğru özellik kullanımını zorunlu kılmak için derleme zamanında bunu kullanır. Her iki katman da korunur.

Kısa Kontrol

Ayırt edici birleşimde ayırt edici nedir?

Özet

Ayırt edici birleşimler, ortak bir sabit türde ayırt edici alanı paylaşarak karşılıklı olarak dışlanan özellik kümelerine sahip bileşenleri modeller. Kapsamlılık kontrolleri için varsayılan dalda never kullanın. İsteğe bağlı özelliklerin izin verdiği geçersiz özellik birleşimlerini ortadan kaldırarak bileşenleri kendilerini belgeleyen ve tür açısından güvenli yaparlar.

Başlamak ücretsiz

Yapay zeka eğitmeniyle React öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
88
Dersler
324

Sıkça Sorulan Sorular

“Bileşen Varyantları için Ayırt Edici Birleşimler” dersi ücretsiz mi?

Evet — “Bileşen Varyantları için Ayırt Edici Birleşimler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve React Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. React Academy kursu toplamda 4 dersten oluşur.

“Bileşen Varyantları için Ayırt Edici Birleşimler” dersinde ne öğreneceğim?

TypeScript'in geçerli prop birleşimlerini zorunlu kılması için varyant prop'larını ayırt edici birleşimlerle modelleyin. React Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

React Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te React Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Bileşen Varyantları için Ayırt Edici Birleşimler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu React Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her React Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Bileşen Varyantları için Ayırt Edici Birleşimler
  2. React'te Koşullu ve Eşlenmiş Türler
  3. 'as' Prop'lu Polimorfik Bileşenler
  4. Tür Güvenli Formlar ve API Yanıt Sözleşmeleri
← React Academy Sayfasına Dön