Skip to content

Commit 9537bf6

Browse files
Merge pull request #1112 from Namchee/id-3.7-syntax
docs(translation): Add Indonesian translation for TS 3.7 Syntax and Messaging section
2 parents 1381fbc + cefdd85 commit 9537bf6

File tree

3 files changed

+186
-0
lines changed

3 files changed

+186
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//// { compiler: { }, order: 3 }
2+
3+
// Pesan kesalahan yang ditampilkan TypeScript terkadang berlebihan.
4+
// Dengan TypeScript 3.7, kami telah mengambil beberapa kasus dimana
5+
// pesan kesalahan yang ditampilkan oleh TypeScript sangat buruk.
6+
7+
// Properti bersarang
8+
9+
let a = { b: { c: { d: { e: "string" } } } };
10+
let b = { b: { c: { d: { e: 12 } } } };
11+
12+
a = b;
13+
14+
// Sebelumnya, terdapat 2 baris kode untuk satu properti bersarang,
15+
// dimana orang-orang akan belajar untuk membaca pesan kesalahan
16+
// dengan membaca baris pertama terlebih dahulu dan kemudian
17+
// membaca baris terakhir.
18+
19+
// Sekarang pesan kesalahan tersebut ditampilkan dalam satu baris. :tada:
20+
21+
// Sebelumnya pada versi 3.6:
22+
//
23+
// Type '{ b: { c: { d: { e: number; }; }; }; }' is not assignable to type '{ b: { c: { d: { e: string; }; }; }; }'.
24+
// Types of property 'b' are incompatible.
25+
// Type '{ c: { d: { e: number; }; }; }' is not assignable to type '{ c: { d: { e: string; }; }; }'.
26+
// Types of property 'c' are incompatible.
27+
// Type '{ d: { e: number; }; }' is not assignable to type '{ d: { e: string; }; }'.
28+
// Types of property 'd' are incompatible.
29+
// Type '{ e: number; }' is not assignable to type '{ e: string; }'.
30+
// Types of property 'e' are incompatible.
31+
// Type 'number' is not assignable to type 'string'
32+
33+
// Cara ini dapat menampilkan pesan kesalahan pada berbagai
34+
// tipe objek, namun tetap mampu untuk menampilkan
35+
// pesan kesalahan yang jelas dan berguna.
36+
37+
class ContohKelas {
38+
state = "ok";
39+
}
40+
41+
class KelasLain {
42+
state = 12;
43+
}
44+
45+
let x = { a: { b: { c: { d: { e: { f: ContohKelas } } } } } };
46+
let y = { a: { b: { c: { d: { e: { f: KelasLain } } } } } };
47+
x = y;
48+
49+
// Sebelumnya pada versi 3.6:
50+
//
51+
// Type '{ a: { b: { c: { d: { e: { f: typeof KelasLain; }; }; }; }; }; }' is not assignable to type '{ a: { b: { c: { d: { e: { f: typeof ContohKelas; }; }; }; }; }; }'.
52+
// Types of property 'a' are incompatible.
53+
// Type '{ b: { c: { d: { e: { f: typeof KelasLain; }; }; }; }; }' is not assignable to type '{ b: { c: { d: { e: { f: typeof ContohKelas; }; }; }; }; }'.
54+
// Types of property 'b' are incompatible.
55+
// Type '{ c: { d: { e: { f: typeof KelasLain; }; }; }; }' is not assignable to type '{ c: { d: { e: { f: typeof ContohKelas; }; }; }; }'.
56+
// Types of property 'c' are incompatible.
57+
// Type '{ d: { e: { f: typeof KelasLain; }; }; }' is not assignable to type '{ d: { e: { f: typeof ContohKelas; }; }; }'.
58+
// Types of property 'd' are incompatible.
59+
// Type '{ e: { f: typeof KelasLain; }; }' is not assignable to type '{ e: { f: typeof ContohKelas; }; }'.
60+
// Types of property 'e' are incompatible.
61+
// Type '{ f: typeof KelasLain; }' is not assignable to type '{ f: typeof ContohKelas; }'.
62+
// Types of property 'f' are incompatible.
63+
// Type 'typeof KelasLain' is not assignable to type 'typeof ContohKelas'.
64+
// Type 'KelasLain' is not assignable to type 'ContohKelas'.
65+
// Types of property 'state' are incompatible.
66+
// Type 'number' is not assignable to type 'string'
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// { compiler: { }, order: 2 }
2+
3+
// Operator _nullish coalescing_ adalah sebuah alternatif
4+
// untuk operator || yang akan mengembalikan ekspresi sebelah kanan
5+
// apabila ekspresi sebelah kiri bernilai null atau undefined.
6+
7+
// Sebaliknya, operator || menggunakan pemeriksaan _falsy_, yang berarti
8+
// sebuah string kosong atau bilangan yang bernilai akan dianggap false.
9+
10+
// Sebuah contoh yang baik untuk fitur ini adalah ketika berurusan dengan
11+
// objek parsial yang memiliki nilai anggapan ketika sebuah pengidentifikasi
12+
// tidak dinyatakan.
13+
14+
interface KonfigurasiAplikasi {
15+
// Nilai anggapan: "(tidak bernama)"; string kosong merupakan nilai yang VALID
16+
nama: string;
17+
18+
// Nilai anggapan: -1; 0 merupakan nilai yang valid
19+
barang: number;
20+
21+
// Nilai anggapan: true
22+
aktif: boolean;
23+
}
24+
25+
function perbaruiAplikasi(konfigurasi: Partial<KonfigurasiAplikasi>) {
26+
// Dengan operator _null-coalescing_
27+
konfigurasi.nama = konfigurasi.nama ?? "(tidak bernama)";
28+
konfigurasi.barang = konfigurasi.barang ?? -1;
29+
konfigurasi.aktif = konfigurasi.aktif ?? true;
30+
31+
// Solusi saat ini
32+
konfigurasi.nama = typeof konfigurasi.nama === "string" ? konfigurasi.nama : "(tidak bernama)";
33+
konfigurasi.barang = typeof konfigurasi.barang === "number" ? konfigurasi.barang : -1;
34+
konfigurasi.aktif = typeof konfigurasi.aktif === "boolean" ? konfigurasi.aktif : true;
35+
36+
// Menggunakan operator || yang dapat menghasilkan data yang buruk
37+
konfigurasi.nama = konfigurasi.nama || "(tidak bernama)"; // tidak mengizinkan masukan bernilai ""
38+
konfigurasi.barang = konfigurasi.barang || -1; // tidak mengizinkan masukan bernilai 0
39+
konfigurasi.aktif = konfigurasi.aktif || true; // sangat buruk, karena selalu mengembalikan nilai true
40+
}
41+
42+
// Anda dapat membaca lebih lanjut tentang _nullish coalescing_ pada
43+
// tulisan blog versi 3.7:
44+
//
45+
// https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//// { compiler: { }, order: 1 }
2+
3+
// _Optional Chaining_ mencapai konsesus TC39 Tahap 3 ketika
4+
// TypeScript 3.7 sedang dikembangkan. _Optional Chaining_
5+
// mengizinkan Anda untuk menulis kode yang akan langsung berhenti
6+
// menjalankan ekspresi ketika sebuah nilai null dan undefined
7+
// ditemukan.
8+
9+
// Akses Properti
10+
11+
// Coba bayangkan bahwa ada sebuah album dimana artis dan
12+
// biografinya mungkin tidak tertera pada data album tersebut.
13+
// Contohnya, sebuah album kompilasi bisa saja sama sekali
14+
// tidak memiliki seorang artis.
15+
16+
type ResponAPIAlbum = {
17+
judul: string;
18+
artis?: {
19+
nama: string;
20+
biografi?: string;
21+
albumSebelumnya?: string[];
22+
};
23+
};
24+
25+
declare const album: ResponAPIAlbum;
26+
27+
// Dengan _optional chaining_, Anda dapat
28+
// menulis kode seperti berikut:
29+
30+
const biografiArtis = album?.artis?.biografi;
31+
32+
// Dibandingkan dengan:
33+
34+
const mungkinBiografiArtis = album.artis && album.artis.biografi;
35+
36+
// Pada kasus ini, operator ?. akan mengambil tindakan yang berbeda bila
37+
// dibandingkan dengan operator && karena operator && akan
38+
// bertindak berbeda pada nilai "falsy" (contoh: sebuah string kosong,
39+
// 0, NaN, dan false).
40+
41+
// _Optional chaining_ hanya akan menganggap null atau undefined
42+
// sebagai sebuah sinyal untuk berhenti dan mengembalikan nilai undefined.
43+
44+
// Akses Elemen Opsional
45+
46+
// Properti dapat diakses melalui operator., _optional chaining_
47+
// juga dapat digunakan dengan operator [] ketika mengakses elemen
48+
49+
const mungkinElemenBiografiArtis = album?.["artis"]?.["biografi"];
50+
51+
const mungkinAlbumSebelumnyaYangPertama = album?.artis?.albumSebelumnya?.[0];
52+
53+
// Pemanggilan Opsional
54+
55+
// Ketika berurusan dengan fungsi yang mungkin tidak ada
56+
// pada saat program berjalan (runtime), _optional chaining_ mendukung
57+
// kasus-kasus dimana sebuah fungsi hanya akan dipanggil
58+
// jika fungsi tersebut ada. Hal tersebut dapat menggantikan kode yang
59+
// biasanya ditulis seperti: if (func) func()
60+
61+
// Sebagai contoh, disini terdapat sebuah pemanggilan opsional
62+
// pada _callback_ dari sebuah permintaan API
63+
64+
const panggilPembaruanMetadata = (metadata: any) => Promise.resolve(metadata); // Pemanggilan API palsu
65+
66+
const perbaruiMetadataAlbum = async (metadata: any, callback?: () => void) => {
67+
await panggilPembaruanMetadata(metadata);
68+
69+
callback?.();
70+
};
71+
72+
// Anda dapat membaca lebih lanjut tentang _optional chaining_
73+
// pada tulisan blog TypeScript 3.7:
74+
//
75+
// https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/

0 commit comments

Comments
 (0)