Skip to main content

Utilizing Decorators in Typescript

Decorator is a quite good feature in Typescript even though it is currently still in an experimental state. But, because of its advantages, it is commonly used by any developer. Such a framework like Angular also heavily uses this feature from the beginning.

A decorator is a syntax for calling a function on the thing that it is decorated. It acts like a wrapper function or higher-order function that results in an improved thing or thing with additional things. The thing may be a class, class method, class property, or method property. The thing that will be decorated must have a specific type signature. A class decorator can only decorate a class, an object that has a constructor.

@mydecorator
class MyClass {}

The code above is similar to the following code.

class MyClass {}
const WrappedClass = mydecorator(MyClass);

We will take the example of utilizing a class decorator. First, we need to create a type of class constructor that passes a generic type for defining the shape of the class instance. The type can be generated by the new operator which is applied to a function that returns a generic type value.

type Constructor<T> = new (...args: any[]) => T;

Then, we set up our decorator by creating a function that accepts a class with a valid type as the first parameter. A valid type means that it extends the class constructor. Besides that, it should have specific properties or methods that can define the shape of the specified class instance. For example, the class will have the getValue() method that results in an object.

function withJson<T extends Constructor<{
  getValue: () => { point: number }
}>>(Class: T) {
  return class extends Class {
    getJson = () => {
      return JSON.stringify(this.getValue());
    }
  }
}

We can apply the function as a decorator for a class that aligns with the class constructor or in other words, it implements getValue() method.

@withJson
class MyClass {
    value = { point: 10 };
    getValue() {
    	return this.value;
    }
}

Then, we can create an instance of the class and call the getJson() method.

const myObject = new MyClass();
console.log(myObject.getJson());

But, Typescript will show an error by the previous code. It is because the decorator won't change the shape or type structure that will be interpreted by Typescript. The getJson() method won't be recognized as the valid property of the class instance. There are several solutions for this case. But, what more appropriate is by declaring a class which is defining the method as property and extending the declared class to the decorated class.

class Helper {
    getJson: any;
}

@withJson
class MyClass extends Helper {
    value = { point: 10 };
    getValue() {
    	return this.value;
    }
}

Last, how it is if we want to create a factory of a decorator that accepts any parameters for defining the resulting decorator. We can customize the withJson() method into a factory. As an example, we will create a factory that accepts a parameter as an additional value for the point property in the instance value.

const withJson = (additionalValue: number) => {
  return <T extends Constructor<{
    getValue: () => { point: number }
  }>>(Class: T) => {
    return class extends Class {
      getJson = () => {
        return JSON.stringify({ point: this.getValue().point + additionalValue});
      }
    }
  };
}

@withJson(5)
class MyClass extends Helper {
//...
}

const myObject = new MyClass();
console.log(myObject.getJson());

So, if the code above is run, it will result in { "point": 15 }.


Comments

Popular posts from this blog

Kerusakan pada Motherboard

1. Sering terjadi hang memory tidak cocok --- ganti memory ada virus di harddisk --- scan harddisk over clock --- seting kembali clock prosesor ada bad sector di harddisk --- partisi harddisk dengan benar 2. Pembacaan data menjadi lambat memori tidak cukup --- tambah memori harddisk penuh atau ada virus --- kurangi isi harddisk, scan harddisk, atau ganti hardisk 3. CMOS failure baterai habis --- ganti baterai CMOS seting BIOS berubah --- seting kembali BIOS 4. Tidak bisa booting cache memory rusak --- disable eksternal cache memory di BIOS memori tidak cocok --- ganti memori boot sector pada harddisk rusak --- masukkan operating system baru ada bad sector pada trek awal harddisk --- partisi harddisk 5. Suara bip panjang berkali-kali memori rusak --- periksa kedudukan memori memori tidak cocok --- ganti memori memori tidak masuk slot dengan sempurna --- periksa kembali kedudukan memori 6. Suara bip bagus tetapi tidak ada tampilan / bip dua kali VGA card

Rangkaian Sensor Infrared dengan Photo Dioda

Keunggulan photodioda dibandingkan LDR adalah photodioda lebih tidak rentan terhadap noise karena hanya menerima sinar infrared, sedangkan LDR menerima seluruh cahaya yang ada termasuk infrared. Rangkaian yang akan kita gunakan adalah seperti gambar di bawah ini. Pada saat intensitas Infrared yang diterima Photodiode besar maka tahanan Photodiode menjadi kecil, sedangkan jika intensitas Infrared yang diterima Photodiode kecil maka tahanan yang dimiliki photodiode besar. Jika  tahanan photodiode kecil  maka tegangan  V- akan kecil . Misal tahanan photodiode mengecil menjadi 10kOhm. Maka dengan teorema pembagi tegangan: V- = Rrx/(Rrx + R2) x Vcc V- = 10 / (10+10) x Vcc V- = (1/2) x 5 Volt V- = 2.5 Volt Sedangkan jika  tahanan photodiode besar  maka tegangan  V- akan besar  (mendekati nilai Vcc). Misal tahanan photodiode menjadi 150kOhm. Maka dengan teorema pembagi tegangan: V- = Rrx/(Rrx + R2) x Vcc V- = 150 / (150+10) x Vcc V- = (150/160) x 5

Refund Tiket Kereta Api

Pada Desember 2013 saya telah berencana untuk pergi ke Kebumen dari Bandung menggunakan kereta api. Namun karena ada tugas yang mendesak maka saya membatalkan rencana tersebut. Tiket saya beli secara online. Pada waktu itu peraturan pembatalan pembelian tiket adalah 1 jam sebelum keberangkatan. Saya mengajukan pembatalan pada satu hari sebelum keberangkatan. Langkah-langkah pengajuan refund adalah seperti berikut. Jika Anda membeli tiket secara online, cetaklah tiket Anda terlebih dahulu di stasiun. Untuk stasiun Bandung lokasi pencetakan tiket di dekat loket Costumer Service. Pencetakan dilakukan sendiri (self service) menggunakan perangkat komputer yang disediakan dengan memasukkan kode booking pada aplikasi yang ada. Setelah itu Anda dapat bertanya pada petugas di mana loket untuk pengajuan refund. Untuk stasiun Bandung loket untuk pengajuan refund saat itu berada di loket terakhir yaitu loket 9.  Setelah menunjukkan tiket maka kita diminta mengisi formulir pengajuan pembatalan.

Itachi Uchiha

The Real Hero of Konoha

Setting Up Next.js Project With ESLint, Typescript, and AirBnB Configuration

If we initiate a Next.js project using the  create-next-app tool, our project will be included with ESLint configuration that we can apply using yarn run lint . By default, the tool installs eslint-config-next and extends next/core-web-vitals in the ESLint configuration. The Next.js configuration has been integrated with linting rules for React and several other libraries and tools. yarn create next-app --typescript For additional configuration such as AirBnB, it is also possible. First, we need to install the peer dependencies of eslint-config-airbnb . We also add support for Typescript using eslint-config-airbnb-typescript . yarn add --dev eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks yarn add --dev eslint-config-airbnb-typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser After that, we can update the .eslintrc.json file for the new configuration. { "extends": [ "airb

Pemrograman Paralel dengan CUDA

CUDA ( Compute Unified Device Architecture ) adalah suatu skema yang dibuat oleh NVIDIA agar NVIDIA selaku GPU ( Graphic Processing Unit ) mampu melakukan komputasi tidak hanya untuk pengolahan grafis namun juga untuk tujuan umum. Jadi, dengan CUDA, kita dapat memanfaatkan cukup banyak  processor  yang dimiliki oleh NVIDIA untuk berbagai perhitungan. GPU yang ada  saat ini seperti ATI pun sudah memiliki banyak processor di dalamnya. Pada ATI, skema yang mereka bangun disebut ATI Stream. Saat ini pemrograman paralel menjadi sangat penting karena kebutuhan kemampuan komputasi komputer yang terus meningkat seperti kemampuan multitasking  dan pengolahan grafis yang andal. Metode saat ini dalam peningkatan peforma komputer juga berbeda dengan masa lampau dimana peningkatan clock  dari processor  yang diutamakan. Peningkatan clock  juga dibatasi oleh kemampuan fisik dari perangkat digital yaitu persoalan daya dan panas. Pada 2005 berbagai industri komputer mulai menawakan komputer den