Skip to content

Commit 1105846

Browse files
Merge pull request #1281 from Namchee/id-js-functions
docs(i18n-id): Provide Indonesian translation for section JavaScript/Functions With JavaScript
2 parents 6c70a47 + cd02108 commit 1105846

File tree

3 files changed

+354
-0
lines changed

3 files changed

+354
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
//// { order: 2, compiler: { esModuleInterop: true } }
2+
3+
// Fungsi berantai merupakan sebuah pola pemrograman
4+
// yang umum digunakan di JavaScript, yang dapat membuat
5+
// kode program Anda lebih terfokus karena nilai penengah
6+
// yang lebih sedikit dan lebih mudah dibaca karena kualitas
7+
// penyarangan yang dimiliki fungsi berantai.
8+
9+
// Sebuah API yang sangat umum yang bekerja menggunakan
10+
// fungsi berantai adalah jQuery. Di bawah ini merupakan
11+
// sebuah contoh penggunaan jQuery dengan tipe data
12+
// dari DefinitelyTyped:
13+
14+
import $ from "jquery";
15+
16+
// Berikut merupakan sebuah contoh penggunaan API jQuery:
17+
18+
$("#navigasi").css("background", "red").height(300).fadeIn(200);
19+
20+
// Jika Anda menambahkan sebuah titik pada baris kode di atas,
21+
// Anda akan melihat daftar fungsi yang panjang. Pola pemrograman ini
22+
// mudah diimplementasikan di JavaScript. Kuncinya adalah
23+
// memastikan bahwa Anda selalu mengembalikan objek yang sama.
24+
25+
// Berikut merupakan contoh sebuah API yang membentuk
26+
// sebuah rantai API. Kuncinya adalah mempunya sebuah
27+
// fungsi luar yang menyimpan keadaan internal, dan
28+
// sebuah objek yang mengekspos API yang selalu dikembalikan.
29+
30+
const jumlahkanDuaBilangan = (mulai = 1) => {
31+
let n = mulai;
32+
33+
const api = {
34+
// Implementasikan seluruh fungsi pada API Anda.
35+
tambah(inc: number = 1) {
36+
n += inc;
37+
return api;
38+
},
39+
40+
cetak() {
41+
console.log(n);
42+
return api;
43+
},
44+
};
45+
return api;
46+
};
47+
48+
// Penulisan tersebut memiliki gaya API yang sama
49+
// seperti yang sudah kita lihat pada jQuery:
50+
51+
jumlahkanDuaBilangan(1).tambah(3).tambah().cetak().tambah(1);
52+
53+
// Berikut merupakan sebuah contoh implementasi fungsi berantai]
54+
// menggunakan kelas:
55+
56+
class TambahBilangan {
57+
private n: number;
58+
59+
constructor(mulai = 0) {
60+
this.n = mulai;
61+
}
62+
63+
public tambah(inc = 1) {
64+
this.n = this.n + inc;
65+
return this;
66+
}
67+
68+
public cetak() {
69+
console.log(this.n);
70+
return this;
71+
}
72+
}
73+
74+
// Berikut merupakan cara penggunaan kelas tersebut:
75+
76+
new TambahBilangan(2).tambah(3).tambah().cetak().tambah(1);
77+
78+
// Contoh-contoh pada bagian ini menggunakan fitur
79+
// penyimpulan tipe data TypeScript untuk menyediakan
80+
// perkakas TypeScript pada pola pemrograman JavaScript.
81+
82+
// For more examples on this:
83+
//
84+
// - example:code-flow
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// Tipe data generik menyediakan sebuah cara untuk menggunakan tipe
2+
// data sebagai sebuah variabel dalam tipe data lain, yaitu
3+
// meta.
4+
5+
// Kami akan berusaha membuat contoh ini sesederhana mungkin,
6+
// Anda dapat melakukan banyak hal dengan tipe data generik dan
7+
// kemungkinan suatu saat Anda akan melihat kode program yang
8+
// sangat rumit yang memanfaatkan tipe data generik - namun hal
9+
// tersebut tidak berarti bahwa tipe data generik merupakan sesuatu
10+
// yang rumit.
11+
12+
// Mari kita mulai dengan sebuah contoh dimana kita akan
13+
// membungkus sebuah objek input dalam sebuah _array_. Kita
14+
// hanya akan mengamati satu variabel pada contoh ini,
15+
// yaitu tipe data yang diteruskan:
16+
17+
function bungkusDalamArray<Tipe>(input: Tipe): Tipe[] {
18+
return [input];
19+
}
20+
21+
// Catatan: biasanya kita melihat `Tipe` ditulis sebagai `T`.
22+
// Hal tersebut merupakan kebiasaan yang mirip dengan bagaimana
23+
// orang menggunakan `i` dalam sebuah perulangan `for` untuk
24+
// merepresentasikan indeks. `T` biasanya merepresentasikan `Tipe`,
25+
// sehingga kami akan menuliskan dengan lengkap demi
26+
// kejelasan kode program.
27+
28+
// Fungsi yang kita buat akan menggunakan fitur penyimpulan
29+
// tipe data supaya dapat menjamin tipe data yang
30+
// diteruskan pada fungsi akan selalu sama dengan tipe
31+
// data yang dikembalikan oleh fungsi tersebut (walaupun
32+
// tipe data tersebut akan dibungkus dalam sebuah _array_).
33+
34+
const arrayString = bungkusDalamArray("hello generics");
35+
const arrayBilangan = bungkusDalamArray(123);
36+
37+
// Kita dapat membuktikan bahwa jaminan tersebut
38+
// bekerja sesuai keinginan dengan memeriksa apakah
39+
// kita dapat menetapkan sebuah _array string_ pada sebuah
40+
// fungsi yang seharusnya merupakan sebuah _array_ objek:
41+
const bukanArrayString: string[] = bungkusDalamArray({});
42+
43+
// Anda juga dapat melewati penyimpulan tipe data generik
44+
// dengan menambahkan tipe data:
45+
const arrayStringKedua = bungkusDalamArray<string>("");
46+
47+
// `bungkusDalamArray` memperbolehkan penggunaan semua
48+
// tipe data, namun ada beberapa masalah dimana Anda ingin
49+
// bahwa hanya beberapa tipe data dan turunannya yang diperbolehkan.
50+
// Untuk mengatasi masalah tersebut, Anda dapat menetapkan
51+
// bahwa tipe data generik harus merupakan turunan dari tipe
52+
// data tertentu.
53+
54+
interface Drawable {
55+
gambar: () => void;
56+
}
57+
58+
// Fungsi ini menerima sekumpulan objek yang memiliki
59+
// fungsi untuk menggambar pada layar.
60+
function gambarPadaLayar<Tipe extends Drawable>(input: Tipe[]) {
61+
input.forEach((i) => i.gambar());
62+
}
63+
64+
const objekDenganGambar = [{ gambar: () => { } }, { gambar: () => { } }];
65+
gambarPadaLayar(objekDenganGambar);
66+
67+
// Fungsi tersebut akan gagal dipanggil
68+
// apabila salah satu objek tidak memiliki
69+
// fungsi `gambar`:
70+
71+
gambarPadaLayar([{}, { gambar: () => { } }]);
72+
73+
// Tipe data generik akan mulai terlihat rumit ketika Anda
74+
// memiliki banyak variabel. Berikut merupakan sebuah
75+
// contoh sebuah fungsi _caching_ yang memperbolehkan
76+
// Anda untuk memiliki sekumpulan tipe data input dan
77+
// _cache_.
78+
79+
interface CacheHost {
80+
simpan: (a: any) => void;
81+
}
82+
83+
function simpanObjekDalamCache<Tipe, Cache extends CacheHost>(obj: Tipe, cache: Cache): Cache {
84+
cache.simpan(obj);
85+
return cache;
86+
}
87+
88+
// Contoh tersebut merupakan contoh yang sama seperti
89+
// contoh sebelumnya, namun memiliki sebuah parameter tambahan.
90+
// Catatan: supaya fungsi tersebut dapat dijalankan, kita harus
91+
// menggunakan tipe data `any`. Hal tersebut dapat diatasi
92+
// menggunakan antar muka generik.
93+
94+
interface CacheHostGenerik<TipeKonten> {
95+
simpan: (a: TipeKonten) => void;
96+
}
97+
98+
// Sekarang ketika `CacheHostGeneric` digunakan, Anda
99+
// harus menetapkan `TipeKonten`.
100+
101+
function simpanObjekBertipeDataPadaCache<Type, Cache extends CacheHostGenerik<Type>>(obj: Type, cache: Cache): Cache {
102+
cache.simpan(obj);
103+
return cache;
104+
}
105+
106+
// Contoh-contoh di atas sudah menjelaskan sintaks tipe data generik
107+
// secara sekilas. Namun, tipe data generik mampu memastikan bahwa
108+
// kode program yang Anda buat lebih aman. Hal tersebut merupakan
109+
// kompromi, bahwa Anda memiliki lebih banyak pengetahuan sekarang.
110+
// Ketika Anda menyediakan API untuk orang lain, tipe data generik
111+
// menyediakan sebuah cara yang fleksibel yang memperbolehkan
112+
// orang lain untuk menggunakan tipe data mereka sendiri
113+
// dengan dukungan fitur penyimpulan tipe data.
114+
115+
// Anda dapat melihat contoh-contoh lain tentang tipe data generik
116+
// dengan kelas dan antar muka melalui:
117+
//
118+
// example:advanced-classes
119+
// example:typescript-with-react
120+
// https://www.typescriptlang.org/docs/handbook/generics.html
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
// Fitur penyimpulan tipe data yang dimiliki TypeScript
2+
// dapat meningkatkan kemampuan Anda secara drastis, namun
3+
// terdapat banyak cara lain untuk mendokumentasikan
4+
// fungsi Anda dengan lebih rinci.
5+
6+
// Salah satu titik awal yang baik adalah parameter opsional,
7+
// yang merupakan sebuah cara untuk memberitahu orang lain
8+
// bahwa Anda tidak wajib untuk meneruskan parameter.
9+
10+
let i = 0;
11+
const tambahkanIndeks = (nilai?: number) => {
12+
i += nilai === undefined ? 1 : nilai;
13+
};
14+
15+
// Fungsi tersebut dapat dipanggil dengan cara:
16+
17+
tambahkanIndeks();
18+
tambahkanIndeks(0);
19+
tambahkanIndeks(3);
20+
21+
// Anda dapat menjadikan fungsi sebagai parameter, dimana
22+
// hal tersebut menyediakan fitur penyimpulan tipe data
23+
// ketika Anda menulis fungsi tersebut.
24+
25+
const callbackDenganIndeks = (callback: (i: number) => void) => {
26+
callback(i);
27+
};
28+
29+
// Menyisipkan antar muka fungsi dapat menyebabkan kode program
30+
// sulit dibaca. Menggunakan fitur alias pada tipe data akan
31+
// memperbolehkan Anda memberi nama pada parameter fungsi yang diteruskan.
32+
33+
type callbackBilangan = (i: number) => void;
34+
const callbackDenganIndeks2 = (callback: callbackBilangan) => {
35+
callback(i);
36+
};
37+
38+
// Fungsi tersebut dapat dipanggil seperti berikut:
39+
40+
callbackDenganIndeks(index => {
41+
console.log(index);
42+
});
43+
44+
// Dengan menyorot indeks di atas, Anda dapat melihat bagaimana
45+
// TypeScript telah menyimpulkan indeks sebagai angka dengan tepat.
46+
47+
// Penyimpulan tipe data TypeScript juga dapat dijalankan ketika
48+
// meneruskan sebuah fungsi sebagai sebuah _reference_. Untuk
49+
// menunjukkan hal tersebut, kita akan menggunakan sebuah fungsi
50+
// yang mengubah sebuah angka menjadi sebuah _string_:
51+
52+
const angkaKeString = (n: number) => {
53+
return n.toString();
54+
};
55+
56+
// Fungsi tersebut dapat digunakan pada `map` dalam sebuah
57+
// _array_ untuk mengubah seluruh angka menjadi sebuah sebuah
58+
// _string_. Jika Anda menyorot `angkaSebagaiString` di bawah ini,
59+
// Anda dapat melihat tipe data yang diharapkan.
60+
const angkaSebagaiString = [1, 4, 6, 10].map(i => angkaKeString(i));
61+
62+
// Kita dapat menyingkat penulisan kode program dengan
63+
// langsung meneruskan fungsi dan mendapatkan hasil yang sama
64+
// namun dengan kode program yang lebih terfokus:
65+
const angkaSebagaiStringTerse = [1, 4, 6, 10].map(angkaKeString);
66+
67+
// Anda bisa saja memiliki fungsi yang mampu menerima banyak
68+
// tipe data sekaligus, namun Anda hanya tertarik pada beberapa
69+
// atribut. Kasus tersebut merupakan contoh kasus yang berguna
70+
// untuk _indexed signatures_ pada tipe data. Tipe data di bawah
71+
// ini mendeklarasikan bahwa fungsi ini dapat dipanggil
72+
// menggunakan objek apapun selama objek tersebut memiliki
73+
// atribut `nama`:
74+
75+
interface SeluruhObjekBernama {
76+
nama: string;
77+
[key: string]: any;
78+
}
79+
80+
const cetakNama = (input: SeluruhObjekBernama) => { };
81+
82+
cetakNama({ nama: "joey" });
83+
cetakNama({ nama: "joey", umur: 23 });
84+
85+
// Apabila Anda ingin mempelajari mengenai _index-signatures_
86+
// kami merekomendasikan:
87+
//
88+
// https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks
89+
// https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html
90+
91+
// Anda juga dapat memperbolehkan perilaku TypeScript
92+
// seperti ini dimanapun dengan menyetel `suppressExcessPropertyError`
93+
// pada `tsconfig` - namun, orang lain tidak dapat mengetahui
94+
// hal tersebut apabila API ini dimatikan.
95+
96+
// Fungsi dalam JavaScript dapat menerima berbagai parameter.
97+
// Terdapat dua cara yang umum digunakan untuk mendeskripsikan
98+
// hal tersebut: tipe data gabungan untuk kembalian / masukan, dan
99+
// _function overload_.
100+
101+
// Menggunakan tipe data gabungan pada parameter Anda merupakan
102+
// pilihan yang masuk akal apabila hanya ada satu atau dua perubahan
103+
// dan dokumentasi kode program tidak perlu diubah apabila fungsi
104+
// berubah.
105+
106+
const fungsiBooleanAtauAngka = (input: boolean | number) => { };
107+
108+
fungsiBooleanAtauAngka(true);
109+
fungsiBooleanAtauAngka(23);
110+
111+
// Namun, _function overload_ menyediakan sintaks
112+
// yang lebih luas untuk parameter dan tipe data kembalian.
113+
interface fungsiBooleanAtauAngkaAtauString {
114+
/** Menerima sebuah boolean, mengembalikan sebuah boolean */
115+
(input: boolean): boolean;
116+
/** Menerima sebuah angka, mengembalikan sebuah angka */
117+
(input: number): number;
118+
/** Menerima sebuah _string_, mengembalikan sebuah _string_ */
119+
(input: string): boolean;
120+
}
121+
122+
// Apabila ini merupakan kali pertama Anda melihat `declare`,
123+
// `declare` memperbolehkan Anda untuk memberi tahu TypeScript
124+
// bahwa sesuatu memang ada walaupun benda tersebut tidak
125+
// ada pada waktu eksekusi berkas ini. Hal tersebut berguna
126+
// untuk memetakan kode program yang memiliki efek samping
127+
// namun sangat berguna pada saat demonstrasi program
128+
// yang membutuhkan banyak kode program untuk mengimplementasikannya.
129+
130+
declare const fungsiBooleanAtauAngkaAtauString: fungsiBooleanAtauAngkaAtauString;
131+
132+
const nilaiBoolean = fungsiBooleanAtauAngkaAtauString(true);
133+
const nilaiAngka = fungsiBooleanAtauAngkaAtauString(12);
134+
const nilaiBoolean2 = fungsiBooleanAtauAngkaAtauString("string");
135+
136+
// Apabila Anda menyorot nilai-nilai di atas dan fungsinya, Anda
137+
// dapat melihat dokumentasi yang tepat beserta dengan
138+
// tipe data kembaliannya.
139+
140+
// Menggunakan _function overload_ dapat meningkatkan kemampuan
141+
// Anda secara drastis, namun ada perkakas lain yang dapat
142+
// digunakan untuk tipe data masukan dan kembalian yang berbeda,
143+
// yaitu tipe data generik.
144+
145+
// Contoh ini menyediakan sebuah cara bagi Anda untuk
146+
// menetapkan tipe data sebagai variabel sementara
147+
// pada deklarasi tipe data.
148+
149+
// example:generic-functions
150+
// example:function-chaining

0 commit comments

Comments
 (0)