javascript - Kelas statis TypeScript


Saya ingin beralih ke TypeScript dari JS tradisional karena saya suka sintaks seperti C#. Masalah saya adalah saya tidak bisa mengetahui cara mendeklarasikan kelas statis di TypeScript.

Di C#, saya sering menggunakan kelas statis untuk mengatur variabel dan metode, menempatkannya bersama dalam sebuah kelas bernama, tanpa perlu membuat objek. Di JS murni, saya biasanya melakukan ini dengan sebuah objek JS sederhana:

var myStaticClass = {
    property: 10,
    method: function(){}
}

Dalam TypeScript, saya lebih memilih pendekatan C-sharp saya, tetapi tampaknya kelas statis tidak ada di TS. Apa solusi yang tepat untuk masalah ini?

Jawaban #1

Kelas abstrak telah menjadi entitas utama di TypeScript sejak TypeScript 1.6. Anda tidak dapat menginstansiasi kelas abstrak.

Berikut adalah contohnya:

export abstract class MyClass {         
    public static myProp = "Hello";

    public static doSomething(): string {
      return "World";
    }
}

const okay = MyClass.doSomething();

//const errors = new MyClass(); // Error

Jawaban #2

TypeScript bukan C#, jadi Anda tidak harus mengharapkan konsep yang sama dari C# di TypeScript. Pertanyaannya adalah mengapa Anda menginginkan kelas statis?

Dalam C#, kelas statis hanyalah kelas yang tidak dapat diturunkan dan harus hanya berisi metode statis. C# tidak mengizinkan seseorang untuk mendefinisikan fungsi di luar kelas. Namun, dalam TypeScript hal ini memungkinkan.

Jika Anda sedang mencari cara untuk menempatkan fungsi/metode Anda di dalam namespace (yaitu tidak global), Anda bisa mempertimbangkan menggunakan modul TypeScript, misalnya.

module M {
    var s = "hello";
    export function f() {
        return s;
    }
}

Sehingga Anda dapat mengakses M.f() dari luar, tetapi tidak s, dan Anda tidak dapat memperluas modul tersebut.

Lihat spesifikasi TypeScript untuk detail lebih lanjut.

Jawaban #3

Mendefinisikan properti dan metode statis dari sebuah kelas dijelaskan dalam 8.2.1 dari Spesifikasi Bahasa Typescript:

class Point { 
  constructor(public x: number, public y: number) { 
    throw new Error('cannot instantiate using a static class');
  } 
  public distance(p: Point) { 
    var dx = this.x - p.x; 
    var dy = this.y - p.y; 
    return Math.sqrt(dx * dx + dy * dy); 
  } 
  static origin = new Point(0, 0); 
  static distance(p1: Point, p2: Point) { 
    return p1.distance(p2); 
  } 
}

di mana Point.distance() adalah metode statis (atau metode "kelas").

PEMBARUAN: Tautan di atas telah diperbarui ke versi terbaru yang tersedia dari Spesifikasi Typescript, tetapi harap dicatat bahwa sesuai https://github.com/Microsoft/TypeScript/issues/15711 tidak ada spesifikasi resmi saat ini untuk Typescript, dan juga tidak diharapkan akan ada.

Jawaban #4

Pertanyaan ini cukup lama namun saya ingin memberikan jawaban yang memanfaatkan versi bahasa saat ini. Sayangnya, kelas statis masih belum ada di TypeScript, namun Anda bisa menulis kelas yang berperilaku serupa dengan hanya sedikit overhead menggunakan konstruktor privat yang mencegah instansiasi kelas dari luar.

class MyStaticClass {
    public static readonly property: number = 42;
    public static myMethod(): void { /* ... */ }
    private constructor() { /* noop */ }
}

Cuplikan ini akan memungkinkan Anda menggunakan kelas "statis" mirip dengan padanan C#-nya dengan satu-satunya kelemahan bahwa masih mungkin untuk menginstansiasinya dari dalam. Untungnya, meskipun begitu, Anda tidak dapat memperluas kelas dengan konstruktor privat.

Jawaban #5

Saya mendapatkan kasus penggunaan yang sama hari ini (31/07/2018) dan menemukan ini sebagai solusi sementara. Ini berdasarkan penelitian saya dan berhasil untuk saya. Harapan - Untuk mencapai hal berikut di TypeScript:

var myStaticClass = {
    property: 10,
    method: function(){} 
}

Saya melakukan ini:

//MyStaticMembers.ts
namespace MyStaticMembers {
        class MyStaticClass {
           static property: number = 10;
           static myMethod() {...}
        }
        export function Property(): number {
           return MyStaticClass.property;
        }
        export function Method(): void {
           return MyStaticClass.myMethod();
        }
     }

Oleh karena itu, kita akan mengonsumsinya seperti di bawah ini:

//app.ts
/// <reference path="MyStaticMembers.ts" />
    console.log(MyStaticMembers.Property);
    MyStaticMembers.Method();

Ini berhasil untuk saya. Jika ada yang memiliki saran lain yang lebih baik, tolong beri tahu kita semua!!! Terima kasih...

Artikel terkait