Lompati ke konten utama
Modul 4 · Pelajaran 2 dari 28/14 dalam kursus~15 min
Pelajaran modul (2/2)

Jenis Utilitas

TypeScript menyediakan beberapa tipe utilitas global untuk memfasilitasi transformasi tipe umum. Tipe ini bersifat generik dan memungkinkan Anda membuat tipe baru secara deklaratif dari tipe yang sudah ada.

Empat jenis utilitas yang paling umum digunakan adalah:

1.Partial<T>

Membuat semua properti bertipe T opsional. Ini sangat berguna untuk fungsi pembaruan/tambalan di mana pemanggil mungkin hanya menyediakan subset bidang:

TS
interface User {
  id: number;
  name: string;
  email: string;
}

// All properties of User become optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;

2.Readonly<T>

Membuat semua properti bertipe T hanya dibaca. Setiap upaya untuk menetapkan ulang properti akan memicu kesalahan kompiler pada waktu kompilasi:

TS
interface Point {
  x: number;
  y: number;
}

const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Error: cannot assign to 'x' because it is a read-only property

3.Pick<T, Keys>

Membuat tipe dengan memilih hanya sekumpulan kunci tertentu (diwakili oleh gabungan string) dari tipe T:

TS
interface Article {
  id: number;
  title: string;
  content: string;
  views: number;
}

// Selects only 'title' and 'views': { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;

4.Omit<T, Keys>

Membuat tipe dengan menghapus sekumpulan kunci tertentu dari tipe T. Ini adalah ganda dari Pick:

TS
interface Product {
  id: number;
  name: string;
  price: number;
  secretVendorCode: string;
}

// Removes 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;

5.Record<Keys, Type>

Membuat tipe objek yang kunci propertinya adalah Keys dan nilai propertinya adalah Type. Ini sangat berguna untuk memetakan kunci ke nilai, mewakili kamus atau tabel hash (peta nilai kunci):

TS
type Page = 'home' | 'about' | 'contact';

interface PageInfo {
  title: string;
}

// Creates a dictionary with keys 'home' | 'about' | 'contact' and values PageInfo
const nav: Record<Page, PageInfo> = {
  home: { title: 'Home Page' },
  about: { title: 'About Us' },
  contact: { title: 'Contact Us' },
};

Cobalah sendiri

Latihan 1: Pembaruan Profil dengan Parsial

Latihan#ts.m4.l2.e1
Upaya: 0Memuat…

Selesaikan fungsi updateProfile yang menerima profil asli (Profil) dan objek pembaruan (pembaruan) di mana semua bidang Profil bersifat opsional. Itu harus mengembalikan objek Profil baru yang menggabungkan properti asli dengan pembaruan.

Memuat editor…
Tunjukkan petunjuk

Gunakan jenis utilitas Partial<Profile> untuk parameter pembaruan, dan operator penyebaran untuk menggabungkan objek: { ...asli, ...pembaruan }.

Solusi tersedia setelah 3 upaya

Latihan 2: Menghapus Bidang Sensitif dengan Omit

Latihan#ts.m4.l2.e2
Upaya: 0Memuat…

Mengingat tipe UserAccount, tentukan alias tipe bernama SafeUser yang menghilangkan properti passwordHash yang sensitif.

Memuat editor…
Tunjukkan petunjuk

Gunakan tipe SafeUser = Abaikan<UserAccount, 'passwordHash'>; untuk menghilangkan bidang yang ditentukan.

Solusi tersedia setelah 3 upaya

Latihan 3: Konfigurasi Publik dengan Pick dan Readonly

Latihan#ts.m4.l2.e3
Upaya: 0Memuat…

Mengingat tipe AppConfig, tentukan alias tipe bernama PublicConfig yang merupakan versi hanya-baca (Readonly) yang hanya berisi apiEndpoint dan properti port yang dipilih menggunakan Pick.

Memuat editor…
Tunjukkan petunjuk

Gunakan tipe PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'pelabuhan'>>;

Solusi tersedia setelah 3 upaya

Latihan 4: Registri Pengguna dengan Rekam dan Hanya Baca

Latihan#ts.m4.l2.e4
Upaya: 0Memuat…

Mengingat antarmuka Pengguna dengan bidang id: nomor dan nama: string, buat tipe ReadOnlyUser yang membuat semua bidang di Pengguna hanya dapat dibaca. Kemudian, buat tipe UserRegistry yang mewakili kamus yang kuncinya adalah string (misalnya, string id) dan nilainya adalah ReadOnlyUser.

Memuat editor…
Tunjukkan petunjuk

Gunakan Readonly<User> untuk mendefinisikan ReadOnlyUser, dan Record<string, ReadOnlyUser> untuk registri.

Solusi tersedia setelah 3 upaya