├── .DS_Store ├── 00class.ts ├── 01constructor.ts ├── 02property_method.ts ├── 03constructor2.ts ├── 04inheritance.ts ├── 05super_constructor.ts ├── 06method_overriding.ts ├── 07visibility.ts ├── 08readonly_modifier.ts ├── 09getter_setter.ts ├── 10static_property_method.ts ├── 11return_type.ts ├── 12abstract_class.ts ├── 13interface.ts ├── 14interface_optional_property.ts ├── 15interface_readonly_property.ts ├── 16interface_inheritance.ts ├── 17interface_extends_class.ts ├── 18dependency_injection.ts ├── 19generics.ts ├── 20generic_interface.ts ├── 21generic_types.ts ├── 22generic_class.ts ├── 23generic_class2.ts ├── 24.generic_constraints.ts ├── 25generics_class_constraint.ts ├── 26type_parameters_in_generics_constraint.ts ├── 27namespace.ts ├── 28type_vs_interface.ts └── README.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusendra/oop-with-typescript/6b4f73e98cf7dc7fc0c78d0afe8f28f884d70283/.DS_Store -------------------------------------------------------------------------------- /00class.ts: -------------------------------------------------------------------------------- 1 | class Hewan { 2 | 3 | } 4 | 5 | const kodok = new Hewan(); 6 | const kucing = new Hewan(); 7 | 8 | console.log(typeof kodok); 9 | console.log(typeof Hewan); 10 | -------------------------------------------------------------------------------- /01constructor.ts: -------------------------------------------------------------------------------- 1 | class Hewan2 { 2 | constructor() { 3 | console.log('constructor akan selali dipanggil terlebih dahulu'); 4 | } 5 | } 6 | 7 | const hewan2 = new Hewan2(); -------------------------------------------------------------------------------- /02property_method.ts: -------------------------------------------------------------------------------- 1 | class Hewan3 { 2 | nama: string = ''; 3 | kaki: number = 0; 4 | mamalia: boolean = false; 5 | 6 | bernafas() { 7 | console.log(`${this.nama} sedang bernafas`); 8 | } 9 | } 10 | 11 | const hewan3 = new Hewan3(); 12 | console.log(hewan3); 13 | 14 | hewan3.nama = 'katak'; 15 | hewan3.kaki = 4; 16 | console.log(hewan3); 17 | 18 | hewan3.bernafas(); -------------------------------------------------------------------------------- /03constructor2.ts: -------------------------------------------------------------------------------- 1 | class Hewan4 { 2 | nama: string; 3 | kaki: number; 4 | 5 | constructor(nama: string, kaki: number) { 6 | this.nama = nama; 7 | this.kaki = kaki; 8 | } 9 | } 10 | 11 | const burung = new Hewan4('burung', 2); 12 | console.log(burung); 13 | 14 | // ------------- 15 | class Hewan41 { 16 | constructor(public nama: string, public kaki: number) {} 17 | } 18 | 19 | const burung2 = new Hewan41('burung', 2); 20 | console.log(burung2); -------------------------------------------------------------------------------- /04inheritance.ts: -------------------------------------------------------------------------------- 1 | class Hewan4 { 2 | nama: string = ''; 3 | kaki: number = 0; 4 | 5 | bernafas() { 6 | console.log('nafas'); 7 | } 8 | } 9 | 10 | class Burung4 extends Hewan4 { 11 | warna: string = 'merah'; 12 | } 13 | 14 | const burung4 = new Burung4(); 15 | burung4.nama = 'kenari'; 16 | burung4.kaki = 2; 17 | burung4.warna = 'kuning'; 18 | console.log(burung4); 19 | 20 | burung4.bernafas(); -------------------------------------------------------------------------------- /05super_constructor.ts: -------------------------------------------------------------------------------- 1 | class Hewan5 { 2 | nama: string; 3 | kaki: number; 4 | 5 | constructor(nama: string, kaki: number) { 6 | this.nama = nama; 7 | this.kaki = kaki; 8 | } 9 | } 10 | 11 | class Katak5 extends Hewan5 { 12 | beracun: boolean; 13 | 14 | constructor(nama: string, kaki: number, beracun: boolean) { 15 | super(nama, kaki); 16 | this.beracun = beracun; 17 | } 18 | } 19 | 20 | const katak5 = new Katak5('katak', 4, false); 21 | console.log(katak5); -------------------------------------------------------------------------------- /06method_overriding.ts: -------------------------------------------------------------------------------- 1 | class Hewan6 { 2 | name: string = ''; 3 | 4 | bernafas() { 5 | console.log('sedang bernafas'); 6 | } 7 | } 8 | 9 | class Katak6 extends Hewan6 { 10 | bernafas() { 11 | console.log('malas bernafas'); 12 | } 13 | } 14 | 15 | const katak6 = new Katak6(); 16 | katak6.bernafas(); -------------------------------------------------------------------------------- /07visibility.ts: -------------------------------------------------------------------------------- 1 | // public 2 | // protected 3 | // private 4 | 5 | class Hewan7 { 6 | public nama: string; 7 | private kaki: number; 8 | protected mamalia: boolean; 9 | 10 | constructor(nama: string, kaki: number, mamalia: boolean) { 11 | this.nama = nama; 12 | this.kaki = kaki; 13 | this.mamalia = mamalia; 14 | } 15 | 16 | berjalan() { 17 | 18 | } 19 | } 20 | 21 | class Katak7 extends Hewan7 { 22 | private umurTelur: number = 4; 23 | private umurKecebong: number = 7; 24 | private umurKatak: number = 90; 25 | 26 | getUmur() { 27 | console.log(this.umurTelur + this.umurKecebong + this.umurKatak); 28 | } 29 | } 30 | 31 | const katak7 = new Katak7('asdf', 4, false); -------------------------------------------------------------------------------- /08readonly_modifier.ts: -------------------------------------------------------------------------------- 1 | class Person { 2 | readonly gender: string = 'Pria'; 3 | } 4 | 5 | const person = new Person(); 6 | // person.gender = 'Wanita'; // error 7 | 8 | -------------------------------------------------------------------------------- /09getter_setter.ts: -------------------------------------------------------------------------------- 1 | class ProductA { 2 | private _price: number = 0; 3 | private discount: number = 0.05; 4 | 5 | get price() { 6 | return this._price; 7 | } 8 | 9 | set price(value: number) { 10 | this._price = value - (value * this.discount); 11 | } 12 | } 13 | 14 | const productA = new ProductA(); 15 | productA.price = 2000; 16 | console.log(productA.price); -------------------------------------------------------------------------------- /10static_property_method.ts: -------------------------------------------------------------------------------- 1 | class Ayam { 2 | static kaki: number = 2; 3 | 4 | static jalan() { 5 | console.log(`ayam berjalan dengan ${this.kaki} kaki`); 6 | } 7 | 8 | getKaki() { 9 | // console.log(this.kaki) 10 | console.log(Ayam.kaki) 11 | } 12 | } 13 | 14 | console.log(Ayam.jalan()); 15 | 16 | const ayam2 = new Ayam(); 17 | ayam2.getKaki(); 18 | 19 | // --------------------- 20 | const ayam3 = new Ayam(); 21 | const ayam4 = new Ayam() 22 | const ayam5 = new Ayam() 23 | const ayam6 = new Ayam() 24 | const ayam7 = new Ayam() 25 | const ayam8 = new Ayam() 26 | 27 | console.log(ayam3.getKaki()) 28 | console.log(ayam4.getKaki()) 29 | console.log(ayam5.getKaki()) 30 | console.log(ayam6.getKaki()) 31 | console.log(ayam7.getKaki()) 32 | console.log(ayam8.getKaki()) 33 | 34 | Ayam.kaki = 4; 35 | 36 | 37 | console.log(ayam3.getKaki()) 38 | console.log(ayam4.getKaki()) 39 | console.log(ayam5.getKaki()) 40 | console.log(ayam6.getKaki()) 41 | console.log(ayam7.getKaki()) 42 | console.log(ayam8.getKaki()) -------------------------------------------------------------------------------- /11return_type.ts: -------------------------------------------------------------------------------- 1 | class Burung { 2 | private kaki: number = 2; 3 | 4 | getKaki(): number { 5 | return this.kaki; 6 | } 7 | 8 | terbang(): void { 9 | console.log('terbang'); 10 | } 11 | 12 | async makan(): Promise { 13 | return 321; 14 | } 15 | } -------------------------------------------------------------------------------- /12abstract_class.ts: -------------------------------------------------------------------------------- 1 | abstract class Hewan12 { 2 | name: string; 3 | 4 | constructor(name: string) { 5 | this.name = name; 6 | } 7 | 8 | makan(): void { 9 | console.log(`${this.name} sedang makan`); 10 | } 11 | 12 | abstract bergerak(): void; 13 | } 14 | 15 | class Kucing12 extends Hewan12 { 16 | constructor() { 17 | super('kucing'); 18 | } 19 | 20 | bergerak(): void { 21 | console.log('kucing berjalan'); 22 | } 23 | } 24 | 25 | class Burung12 extends Hewan12 { 26 | constructor() { 27 | super('burung'); 28 | } 29 | 30 | bergerak(): void { 31 | console.log('burung terbang'); 32 | } 33 | } 34 | 35 | const kucing12 = new Kucing12() 36 | kucing12.bergerak(); 37 | 38 | const burung12 = new Burung12() 39 | burung12.bergerak(); -------------------------------------------------------------------------------- /13interface.ts: -------------------------------------------------------------------------------- 1 | interface AndroidPhone { 2 | name: string; 3 | menu(): void; 4 | home(): void; 5 | back(): void; 6 | } 7 | 8 | class Samsung implements AndroidPhone { 9 | name: string; 10 | 11 | constructor(name: string) { 12 | this.name = name; 13 | } 14 | 15 | menu(): void { 16 | console.log('menu tapped'); 17 | } 18 | home(): void { 19 | console.log('home tapped'); 20 | } 21 | back(): void { 22 | console.log('back tapped'); 23 | } 24 | } 25 | 26 | class Asus implements AndroidPhone { 27 | name: string; 28 | 29 | constructor(name: string) { 30 | this.name = name; 31 | } 32 | 33 | menu(): void { 34 | console.log('menu tapped'); 35 | } 36 | home(): void { 37 | console.log('home tapped'); 38 | } 39 | back(): void { 40 | console.log('back tapped'); 41 | } 42 | } 43 | 44 | class GameA { 45 | private phone: AndroidPhone; 46 | 47 | constructor(phone: AndroidPhone) { 48 | this.phone = phone; 49 | } 50 | 51 | back() { 52 | console.log('kembali ke menu utama di game'); 53 | } 54 | 55 | menu() { 56 | this.phone.menu(); 57 | } 58 | 59 | home() { 60 | this.phone.home(); 61 | } 62 | } 63 | 64 | const samsung = new Samsung('Tipe A'); 65 | 66 | const game = new GameA(samsung); 67 | game.home(); 68 | game.back(); 69 | game.menu(); 70 | 71 | // ------------ iPhone 72 | 73 | interface ApplePhone { 74 | home(): void; 75 | } 76 | 77 | class IPhone implements ApplePhone { 78 | name: string; 79 | 80 | constructor(name: string) { 81 | this.name = name; 82 | } 83 | 84 | home(): void { 85 | console.log('muncul global'); 86 | } 87 | } 88 | 89 | const iphone = new IPhone('IPhone SE'); 90 | // const game2 = new GameA(iphone) -------------------------------------------------------------------------------- /14interface_optional_property.ts: -------------------------------------------------------------------------------- 1 | interface Teacher { 2 | name: string; 3 | age: number; 4 | phone?: string; 5 | } 6 | 7 | let teacher: Teacher = { name: 'Nusendra', age: 28 }; -------------------------------------------------------------------------------- /15interface_readonly_property.ts: -------------------------------------------------------------------------------- 1 | interface Student { 2 | readonly name: string; 3 | readonly age: number; 4 | } 5 | 6 | let student: Student = { name: 'Nusendra', age: 25 }; 7 | -------------------------------------------------------------------------------- /16interface_inheritance.ts: -------------------------------------------------------------------------------- 1 | interface Vehicle { 2 | name: string; 3 | wheels: number; 4 | } 5 | 6 | interface ICar extends Vehicle { 7 | doors: number; 8 | } 9 | 10 | class Civic implements ICar { 11 | name: string = 'Civic'; 12 | wheels: number = 4; 13 | doors: number = 4; 14 | } -------------------------------------------------------------------------------- /17interface_extends_class.ts: -------------------------------------------------------------------------------- 1 | class Animal { 2 | name: string; 3 | 4 | constructor(name: string) { 5 | this.name = name; 6 | } 7 | } 8 | 9 | interface IShark extends Animal { 10 | swim(): void; 11 | } 12 | 13 | class Shark implements IShark { 14 | name: string; 15 | 16 | constructor(name: string) { 17 | this.name = name; 18 | } 19 | 20 | swim(): void { 21 | console.log('berenang'); 22 | } 23 | } -------------------------------------------------------------------------------- /18dependency_injection.ts: -------------------------------------------------------------------------------- 1 | class Store { 2 | private name: string = 'Store A'; 3 | private profit: number = 1000; 4 | 5 | getName(): string { 6 | return this.name; 7 | } 8 | 9 | getProfit(): number { 10 | return this.profit; 11 | } 12 | } 13 | 14 | class Store2 { 15 | private name: string = 'Store A'; 16 | private profit: number = 10000; 17 | 18 | getName(): string { 19 | return this.name; 20 | } 21 | 22 | getProfit(): number { 23 | return this.profit; 24 | } 25 | } 26 | 27 | class FashionProduct { 28 | private store: Store; 29 | private name: string; 30 | private price: number; 31 | 32 | constructor(name: string, price: number) { 33 | this.name = name; 34 | this.price = price; 35 | 36 | this.store = new Store(); 37 | } 38 | 39 | sell(): void { 40 | console.log(`${this.name} harga jualnya adalah ${this.store.getProfit() + this.price}`); 41 | } 42 | } 43 | 44 | class TechProduct { 45 | private store: Store; 46 | private name: string; 47 | private price: number; 48 | 49 | constructor(name: string, price: number) { 50 | this.name = name; 51 | this.price = price; 52 | 53 | this.store = new Store(); 54 | } 55 | 56 | sell(): void { 57 | console.log(`${this.name} harga jualnya adalah ${this.store.getProfit() + this.price}`); 58 | } 59 | } 60 | 61 | const baju = new FashionProduct('baju lengan panjang', 50000); 62 | baju.sell(); 63 | 64 | // ----------------------- 65 | 66 | interface IStore { 67 | name: string; 68 | profit: number; 69 | getProfit(): number; 70 | } 71 | 72 | class TokoLama implements IStore { 73 | name: string = 'Toko Lama'; 74 | profit: number = 1000; 75 | 76 | getName(): string { 77 | return this.name; 78 | } 79 | 80 | getProfit(): number { 81 | return this.profit; 82 | } 83 | } 84 | 85 | class TokoBaru implements IStore { 86 | name: string = 'Toko Baru'; 87 | profit: number = 2500; 88 | 89 | getName(): string { 90 | return this.name; 91 | } 92 | 93 | getProfit(): number { 94 | return this.profit; 95 | } 96 | } 97 | 98 | class HijabProduct { 99 | private store: IStore; 100 | private name: string; 101 | private price: number; 102 | 103 | constructor(store: IStore, name: string, price: number) { 104 | this.name = name; 105 | this.price = price; 106 | this.store = store; 107 | } 108 | 109 | sell(): void { 110 | console.log(`${this.name} harga jualnya adalah ${this.store.getProfit() + this.price}`); 111 | } 112 | } 113 | 114 | class FoodProduct { 115 | private store: IStore; 116 | private name: string; 117 | private price: number; 118 | 119 | constructor(store: IStore, name: string, price: number) { 120 | this.name = name; 121 | this.price = price; 122 | this.store = store; 123 | } 124 | 125 | sell(): void { 126 | console.log(`${this.name} harga jualnya adalah ${this.store.getProfit() + this.price}`); 127 | } 128 | } 129 | 130 | const tokoLama = new TokoLama(); 131 | const tokoBaru = new TokoBaru(); 132 | 133 | const hijabMahal = new HijabProduct(tokoLama, 'baju mahal', 80000); 134 | const hijabMahal2 = new HijabProduct(tokoBaru, 'baju mahal', 80000); 135 | 136 | console.log(hijabMahal); 137 | console.log(hijabMahal2); 138 | 139 | hijabMahal.sell(); 140 | hijabMahal2.sell(); -------------------------------------------------------------------------------- /19generics.ts: -------------------------------------------------------------------------------- 1 | function getData(value: any) { 2 | return value; 3 | } 4 | 5 | const data1 = getData(12321); 6 | console.log(data1); 7 | 8 | // ------- 9 | 10 | function getData2(value: T): T { 11 | return value; 12 | } 13 | 14 | const data2 = getData2("test"); 15 | console.log(data2.length) 16 | 17 | const data21 = getData2(123); 18 | console.log(data21.toFixed(2)); -------------------------------------------------------------------------------- /20generic_interface.ts: -------------------------------------------------------------------------------- 1 | interface Generics { 2 | propA: T 3 | } 4 | 5 | function genericsFunction(value: T): Generics { 6 | let data: Generics = { 7 | propA: value 8 | }; 9 | 10 | return data; 11 | } 12 | 13 | console.log(genericsFunction('dsaasd')); 14 | console.log(genericsFunction(1232123)); 15 | console.log(genericsFunction(true)); -------------------------------------------------------------------------------- /21generic_types.ts: -------------------------------------------------------------------------------- 1 | type Generics2 = T; 2 | 3 | interface Generics3 { 4 | asdsa: T 5 | } 6 | 7 | function genericsFunction2(value: T): Generics2 { 8 | return value; 9 | } 10 | 11 | console.log(genericsFunction2('string')); -------------------------------------------------------------------------------- /22generic_class.ts: -------------------------------------------------------------------------------- 1 | interface Generics3 { 2 | propA: T, 3 | methodA(): T 4 | }; 5 | 6 | class GenericsClass implements Generics3 { 7 | propA: T; 8 | 9 | constructor(prop: T) { 10 | this.propA = prop; 11 | } 12 | 13 | methodA(): T { 14 | return this.propA; 15 | } 16 | } 17 | 18 | const genericClassA = new GenericsClass(123); 19 | console.log(genericClassA.methodA()); -------------------------------------------------------------------------------- /23generic_class2.ts: -------------------------------------------------------------------------------- 1 | class ClassA { 2 | name: string = 'Class A'; 3 | } 4 | 5 | class ClassBaru { 6 | classProp: T; 7 | 8 | constructor(classProp: T) { 9 | this.classProp = classProp; 10 | } 11 | } 12 | 13 | const classA = new ClassA(); 14 | const classBaru = new ClassBaru(classA); -------------------------------------------------------------------------------- /24.generic_constraints.ts: -------------------------------------------------------------------------------- 1 | // function generics24(arg: T): T { 2 | // // console.log(arg.length); 3 | // return arg; 4 | // } 5 | 6 | interface Length { 7 | length: number; 8 | } 9 | 10 | function generics24(arg: T): T { 11 | console.log(arg.length); 12 | return arg; 13 | } 14 | 15 | const generics24a = generics24('asfds'); 16 | console.log(generics24a); 17 | 18 | const generics24b = generics24({ length: 10, value: 200 }); -------------------------------------------------------------------------------- /25generics_class_constraint.ts: -------------------------------------------------------------------------------- 1 | interface Product { 2 | sell(): void; 3 | } 4 | 5 | class CarProduct implements Product { 6 | sell(): void { 7 | console.log('jual mobil'); 8 | } 9 | } 10 | 11 | class MotorProduct implements Product { 12 | sell(): void { 13 | console.log('jual motor'); 14 | } 15 | } 16 | 17 | function sellProducts(products: T[]): void { 18 | products.forEach(product => product.sell()); 19 | } 20 | 21 | const car = new CarProduct(); 22 | const motor = new MotorProduct(); 23 | 24 | sellProducts([car, motor]); -------------------------------------------------------------------------------- /26type_parameters_in_generics_constraint.ts: -------------------------------------------------------------------------------- 1 | function getProperty(obj: T, key: U) { 2 | return obj[key]; 3 | } 4 | 5 | let x = { a: 1, b: 2, c: 3, d: 4 }; 6 | 7 | console.log(getProperty(x, "a")); 8 | console.log(getProperty(x, "c")); 9 | 10 | // console.log(getProperty(x, "z")); -------------------------------------------------------------------------------- /27namespace.ts: -------------------------------------------------------------------------------- 1 | namespace NamespaceExample { 2 | export class Hewan { 3 | 4 | } 5 | 6 | export const kodok = new Hewan(); 7 | } 8 | 9 | const belalang = new NamespaceExample.Hewan(); 10 | let kodok2a = NamespaceExample.kodok; -------------------------------------------------------------------------------- /28type_vs_interface.ts: -------------------------------------------------------------------------------- 1 | type Name = { 2 | name: string 3 | } 4 | 5 | type Age = { 6 | age: number 7 | } 8 | 9 | type Employee1 = Name & Age; 10 | type Employee2 = Name | Age; 11 | 12 | const employee: Employee1 = { 13 | name: 'daasd', 14 | age: 20 15 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # oop-with-typescript 2 | 3 | OOP menggunakan TypeScript untuk playlist yucup https://www.youtube.com/playlist?list=PLnQvfeVegcJZRieebeIp0xj1NeC5L633Y 4 | --------------------------------------------------------------------------------