React & TypeScript: Skuy, Bikin Aplikasi Web Sat-Set Anti Error!

Bikin Aplikasi Web dengan React dan TypeScript: Panduan Lengkap

PPLG

PPLG

Penulis

21 Jul 2026
24 x dilihat

Halo gaes! Pengen banget bikin aplikasi web yang powerful, stabil, dan gampang di-maintain? Udah kenal React, tapi pengen naikin level skill biar makin cuan dan nggak pusing sama error-error aneh? Nah, berarti saatnya kita ngobrolin combo maut yang bikin developer mana pun auto jatuh cinta: React + TypeScript! Vibeknya itu loh, ngoding jadi makin asik, auto aman dari error-error nyebelin yang cuma bikin pusing tujuh keliling. Gaskeun!

Kenapa Sih Harus React + TypeScript? Spill Dong!

Mungkin kalian mikir, "React aja udah oke, ngapain pake TypeScript segala?" Eits, jangan salah ngab. TypeScript ini upgrade level buat project React kalian. Ibaratnya, React itu motor balap kenceng, nah TypeScript itu helm, jaket, sama sarung tangan balapnya. Bikin aman dan performa maksimal! Nih, beberapa alasan kenapa combo ini worth it banget:

  1. Type Safety (Auto Aman dari Salah Ketik!): Ini jualan utamanya. TypeScript itu kayak detektif handal, gaes. Dia bakal ngecek kode kita sebelum dijalanin. Jadi, kalo ada salah ketik, tipe data yang nggak cocok (misal, ngasih angka ke variabel yang harusnya string), atau props yang salah pasang, langsung ketahuan pas lagi ngoding. Nggak perlu nunggu sampai aplikasi di-run terus crash baru sadar. Auto sat-set benerinnya!
  2. Developer Experience (DX) Mantul: Dengan TypeScript, IDE kalian (kayak VS Code) bakal jadi super cerdas. Ada fitur autocompletion yang akurat banget, refactoring jadi gampang, dan hover-to-type definition. Ini bikin ngoding jadi lebih cepat, minim typo, dan nggak perlu bolak-balik buka dokumentasi.
  3. Maintainability & Scalability (Gampang Dirawat & Dikembangin): Project gede biasanya melibatkan banyak developer. Dengan TypeScript, kode jadi lebih terstruktur dan mudah dipahami. Tipe data yang jelas bikin developer baru gercep ngerti fungsi sebuah komponen atau data itu isinya apa. Jadi, project bisa dikembangin tanpa takut bikin chaos.
  4. Makin Pede Nulis Kode: Karena udah ada "penjaga" yang ngecek tipe data, kalian bisa lebih pede nulis kode tanpa takut bikin bug sepele. Kualitas kode juga jadi meningkat.

Gimana? Udah mulai ngerasa vibenya kan? Skuy, langsung kita praktikkan!

Persiapan Tempur: Apa Aja yang Dibutuhkan?

Sebelum mulai, pastikan di laptop kalian udah terinstal beberapa tools ini:

  • Node.js & npm/yarn: Node.js itu runtime environment buat JavaScript, dan npm (Node Package Manager) atau yarn itu buat ngatur package yang bakal kita pake. Kalo belum punya, download aja dari website Node.js. Biasanya npm udah include.

Udah? Mantap! Lanjut.

Langkah 1: Bikin Project React + TypeScript Baru

Kita bakal pakai create-react-app (CRA) yang udah nyediain template khusus TypeScript. Gercep aja, buka terminal/CMD kalian, terus ketik:

npx create-react-app nama-project-ku-ts --template typescript

Ganti nama-project-ku-ts sesuai nama project yang kalian mau ya. Prosesnya mungkin agak sedikit makan waktu, jadi santai aja sambil nyeduh kopi.

Setelah selesai, cd ke folder project kalian:

cd nama-project-ku-ts

Terus coba jalankan:

npm start
# atau
yarn start

Browser kalian bakal otomatis kebuka ke http://localhost:3000/ dan nunjukkin logo React. Keren kan?

Langkah 2: Pahami Struktur Dasarnya

Buka project kalian di VS Code atau IDE favorit kalian. Kalian bakal liat struktur folder yang mirip kayak React biasa, tapi ada beberapa perbedaan kunci di file-file dengan ekstensi .ts (TypeScript) dan .tsx (TypeScript React Component):

nama-project-ku-ts/
├── node_modules/
├── public/
├── src/
│   ├── App.css
│   ├── App.test.tsx
│   ├── App.tsx          <-- Komponen utama kita!
│   ├── index.css
│   ├── index.tsx        <-- Entry point aplikasi
│   ├── logo.svg
│   ├── react-app-env.d.ts
│   ├── reportWebVitals.ts
│   └── setupTests.ts
├── .gitignore
├── package.json
├── README.md
├── tsconfig.json        <-- Ini file konfigurasi TypeScript
└── yarn.lock

Perhatiin App.tsx dan index.tsx. File-file ini udah pake TypeScript! Juga ada tsconfig.json yang isinya konfigurasi TypeScript untuk project kalian.

Langkah 3: Ngoding Bareng: Bikin Aplikasi To-Do List Sederhana!

Skuy, biar makin ngerti, kita coba bikin aplikasi To-Do List sederhana. Kita bakal belajar gimana cara definisiin tipe data, pake useState dengan tipe, dan passing props.

Pertama, kita butuh package uuid buat generate ID unik untuk setiap item todo. Instal dulu:

npm install uuid @types/uuid
# atau
yarn add uuid @types/uuid

@types/uuid itu package khusus yang isinya definisi tipe TypeScript buat library uuid. Mantul kan?

Oke, sekarang kita bikin file types.ts di dalam folder src/. Ini buat nampung semua definisi tipe data kita biar rapi.

src/types.ts

// src/types.ts
export interface Todo {
  id: string;
  text: string;
  isCompleted: boolean;
}

Penjelasan:

  • Kita definisiin sebuah interface bernama Todo. Ini kayak cetak biru atau "kontrak" yang bilang kalo setiap objek Todo harus punya properti id (tipe string), text (tipe string), dan isCompleted (tipe boolean). Kalo ada yang nggak sesuai, TypeScript auto ngamuk!

Sekarang, kita bikin komponen-komponennya. Bikin folder src/components buat nyimpen komponen-komponen kita.

src/components/TodoForm.tsx Ini komponen buat input todo baru.

// src/components/TodoForm.tsx
import React, { useState } from 'react';

// Definisi tipe untuk props komponen TodoForm
interface TodoFormProps {
  addTodo: (text: string) => void; // Fungsi yang menerima string dan tidak mengembalikan apa-apa (void)
}

const TodoForm: React.FC<TodoFormProps> = ({ addTodo }) => {
  const [inputText, setInputText] = useState<string>(''); // useState dengan tipe string

  const handleSubmit = (e: React.FormEvent) => { // Tipe event untuk form submission
    e.preventDefault();
    if (inputText.trim()) {
      addTodo(inputText);
      setInputText('');
    }
  };

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { // Tipe event untuk input perubahan
    setInputText(e.target.value);
  };

  return (
    <form onSubmit={handleSubmit} style={{ display: 'flex', marginBottom: '1rem' }}>
      <input
        type="text"
        style={{ flexGrow: 1, padding: '0.5rem', border: '1px solid #ccc', borderRadius: '4px', marginRight: '0.5rem' }}
        placeholder="Add a new todo..."
        value={inputText}
        onChange={handleChange}
      />
      <button
        type="submit"
        style={{ padding: '0.5rem 1rem', backgroundColor: '#007bff', color: 'white', border: 'none', borderRadius: '4px', cursor: 'pointer' }}
      >
        Add Todo
      </button>
    </form>
  );
};

export default TodoForm;

Penjelasan:

  • interface TodoFormProps: Kita definisiin tipe untuk props TodoForm. Di sini cuma ada addTodo yang tipenya (text: string) => void. Ini artinya addTodo adalah sebuah fungsi yang menerima satu argumen text bertipe string dan tidak mengembalikan nilai (void).
  • useState<string>(''): Pas pake useState, kita bisa kasih tahu TypeScript kalo inputText ini tipenya bakal string. Kalo kita coba kasih setInputText(123), TypeScript auto ngasih warning.
  • e: React.FormEvent dan e: React.ChangeEvent<HTMLInputElement>: TypeScript bantu kita buat tahu tipe event yang lagi kita handle, jadi kita bisa akses properti kayak e.target.value dengan aman tanpa perlu khawatir salah tipe.

Next, komponen buat nampilin tiap item todo.

src/components/TodoItem.tsx

// src/components/TodoItem.tsx
import React from 'react';
import { Todo } from '../types'; // Import interface Todo yang udah kita buat

// Definisi tipe untuk props komponen TodoItem
interface TodoItemProps {
  todo: Todo; // Objek todo yang tipenya harus sesuai interface Todo
  toggleComplete: (id: string) => void; // Fungsi untuk toggle status complete
}

const TodoItem: React.FC<TodoItemProps> = ({ todo, toggleComplete }) => {
  return (
    <li
      style={{
        display: 'flex',
        justifyContent: 'space-between',
        alignItems: 'center',
        padding: '0.5rem',
        marginBottom: '0.5rem',
        borderRadius: '4px',
        backgroundColor: todo.isCompleted ? '#d4edda' : '#f8f9fa', // Warna beda kalo udah complete
        textDecoration: todo.isCompleted ? 'line-through' : 'none', // Coret kalo udah complete
      }}
    >
      <span style={{ fontSize: '1.1rem' }}>{todo.text}</span>
      <button
        onClick={() => toggleComplete(todo.id)}
        style={{
          marginLeft: '1rem',
          padding: '0.4rem 0.8rem',
          backgroundColor: '#28a745',
          color: 'white',
          border: 'none',
          borderRadius: '4px',
          cursor: 'pointer',
        }}
      >
        {todo.isCompleted ? 'Unmark' : 'Complete'}
      </button>
    </li>
  );
};

export default TodoItem;

Penjelasan:

  • todo: Todo: Nah, di sini kita kasih tahu kalo props todo itu tipenya harus objek Todo yang udah kita definisiin di types.ts. Jadi kalo kita salah ngirim props todo yang nggak ada properti id atau text, TypeScript bakal protes!
  • toggleComplete: (id: string) => void: Sama kayak di TodoFormProps, kita definisiin tipe fungsi untuk prop ini.

Terakhir, kita gabungin semua komponen ini di App.tsx.

src/App.tsx

// src/App.tsx
import React, { useState } from 'react';
import { Todo } from './types'; // Import interface Todo
import TodoForm from './components/TodoForm';
import TodoItem from './components/TodoItem';
import { v4 as uuidv4 } from 'uuid'; // Import uuid

function App() {
  const [todos, setTodos] = useState<Todo[]>([]); // useState dengan array of Todo objects

  const addTodo = (text: string) => {
    const newTodo: Todo = { // Pastikan newTodo sesuai dengan interface Todo
      id: uuidv4(),
      text,
      isCompleted: false,
    };
    setTodos((prevTodos) => [...prevTodos, newTodo]);
  };

  const toggleComplete = (id: string) => {
    setTodos((prevTodos) =>
      prevTodos.map((todo) =>
        todo.id === id ? { ...todo, isCompleted: !todo.isCompleted } : todo
      )
    );
  };

  return (
    <div style={{ maxWidth: '500px', margin: '2rem auto', padding: '1.5rem', backgroundColor: '#fff', borderRadius: '8px', boxShadow: '0 4px 12px rgba(0,0,0,0.1)' }}>
      <h1 style={{ textAlign: 'center', marginBottom: '1.5rem', color: '#333' }}>My Awesome Todo List</h1>
      <TodoForm addTodo={addTodo} />
      {todos.length === 0 ? (
        <p style={{ textAlign: 'center', color: '#666' }}>No todos yet. Add some! 😉</p>
      ) : (
        <ul>
          {todos.map((todo) => (
            <TodoItem key={todo.id} todo={todo} toggleComplete={toggleComplete} />
          ))}
        </ul>
      )}
    </div>
  );
}

export default App;

Penjelasan:

  • useState<Todo[]>([]);: Ini penting banget! Kita kasih tahu useState kalo state todos itu tipenya adalah sebuah array ([]) yang isinya objek-objek bertipe Todo. Jadi TypeScript bakal ngecek kalo ada yang mencoba masukkin data aneh ke dalam todos. Auto error kalo nggak sesuai!
  • const newTodo: Todo = {...}: Kita secara eksplisit kasih tahu kalo newTodo itu tipenya Todo. Ini bantu banget memastikan objek yang kita buat bener-bener memenuhi kontrak Todo sebelum dimasukkin ke state.

Mantap! Sekarang coba buka lagi http://localhost:3000/. Kalian bakal liat aplikasi To-Do List yang udah bisa nambahin dan tandain tugas. Coba deh iseng ubah tipe data di App.tsx, misal newTodo.id = 123; (angka). Auto langsung dapet merah-merah dari TypeScript! Itulah powernya, gaes.

Tips & Best Practices Biar Ngoding Makin Ciamik

Biar makin pro dan project kalian makin kinclong, nih beberapa tips praktis:

  1. Gunakan interface untuk Objek dan type untuk Alias/Union:

    • interface cocok banget buat definisi objek yang bisa di-extend atau di-implement.
    • type lebih fleksibel buat alias tipe (misal type ID = string;) atau gabungan tipe (union types, misal type Status = 'pending' | 'completed';).
    • Biasanya, kalo buat objek props atau state, interface sering jadi pilihan favorit.
  2. Manfaatkan React.FC (Functional Component):

    • const MyComponent: React.FC<MyProps> = ({ prop1, prop2 }) => { ... };
    • React.FC secara implisit menyediakan tipe untuk children dan beberapa properti statis. Walaupun ada perdebatan (beberapa orang prefer const MyComponent = ({ prop1, prop2 }: MyProps) => { ... };), ini cara yang populer dan jelas.
  3. Struktur Folder yang Rapi:

    • Pisahkan types.ts di folder src/ atau src/types/ biar gampang dicari.
    • Komponen-komponen ditaruh di src/components/.
    • Hooks kustom di src/hooks/. Konsisten itu kunci!
  4. Jangan Takut Pakai unknown (Bukan any!):

    • Kalo kalian berhadapan dengan data yang tipenya bener-bener nggak diketahui (misal dari API), pake unknown lebih baik daripada any. unknown itu "aman", dia maksa kalian untuk ngecek dulu tipenya sebelum bisa dipake (type narrowing).
    • any itu "kabur", dia matiin semua cek tipe dari TypeScript dan bisa bikin bug tersembunyi. Hindari any sebisa mungkin.
  5. Konfigurasi tsconfig.json yang Bijak:

    • Awalnya, setingan default dari CRA udah bagus. Tapi seiring project makin kompleks, kalian mungkin perlu tweak compilerOptions kayak strict (aktifin semua cek ketat dari TS) atau paths (buat alias import biar lebih rapi).

Kesimpulan: Siap Jadi Developer React TS Pro!

Gimana, gaes? Udah kebayang kan gimana asiknya ngoding pakai React + TypeScript? Ini bener-bener game changer buat bikin aplikasi web yang nggak cuma ciamik di tampilan, tapi juga tangguh dan gampang di-maintenance. Kalian jadi punya "kekuatan super" buat deteksi error lebih awal dan nulis kode yang lebih solid.

Jadi, jangan ragu lagi buat gaskeun dan mulai project React kalian pake TypeScript. Dengan panduan ini, kalian udah punya bekal dasar buat eksplorasi lebih jauh. Selamat ngoding, ngab! Semoga makin cuan dan skill coding kalian makin nggak ada obat!


0.0

Berikan Rating

Komentar (0)

Silakan login untuk memberikan komentar.

Login Sekarang

Belum ada komentar. Jadilah yang pertama!

Menyukai Artikel (0)

Belum ada siswa yang menyukai artikel ini.

Pembaca (0)

Belum ada user yang membaca artikel ini.