angular - Apakah ada tipe untuk "Kelas" di Typescript? Dan apakah "any" mencakupnya?


Di Java, Anda dapat memberikan sebuah kelas ke metode sebagai parameter menggunakan tipe "Class". Saya tidak menemukan hal serupa dalam dokumentasi TypeScript - apakah mungkin menyerahkan sebuah kelas ke metode? Dan jika ya, apakah tipe "any" mencakup tipe-tipe kelas seperti itu?

Latar Belakang: Saya mengalami masalah dengan Webstorm, yang memberi tahu saya bahwa saya tidak dapat menyerahkan sebuah kelas ke @ViewChild(...) di Angular 2. Namun, compiler Typescript tidak mengeluh. Tanda tangan dari @ViewChild() sepertinya adalah "Type<any> | Function | string", jadi saya bertanya-tanya apakah 'any' termasuk Kelas atau tidak.

Jawaban #1

Padanan untuk apa yang Anda tanyakan dalam TypeScript adalah tipe { new(): Class }, misalnya:

class A {}

function create(ctor: { new(): A }): A {
    return new ctor();
}

let a = create(A); // a is instanceof A

(kode di taman bermain)

Kode di atas hanya akan memperbolehkan kelas yang konstruktornya tidak memiliki argumen. Jika Anda menginginkan kelas apa pun, gunakan new (...args: any[]) => Class

Jawaban #2

Solusi paling sederhana adalah let variable: typeof Class.

Berikut ini contohnya:

class A {
  public static attribute = "ABC";
}

function f(Param: typeof A) {
  Param.attribute;
  new Param();
}


f(A);

Jawaban #3

Angular secara internal mendeklarasikan Type sebagai:

export interface Type<T> extends Function { new (...args: any[]): T; }

Dengan TypeScript3 seharusnya mungkin untuk menambahkan tipe pada argumen tanpa overload fungsi:

export interface TypeWithArgs<T, A extends any[]> extends Function { new(...args: A): T; } 

Contoh :

class A {}

function create(ctor: Type<A>): A {
    return new ctor();
}

let a = create(A);

Jawaban #4

Apakah mungkin untuk menyerahkan sebuah kelas ke metode? Dan jika iya, apakah tipe "any" mencakup tipe-tipe kelas tersebut?

Ya dan ya. any mencakup setiap jenis.

Berikut adalah contoh dari sebuah tipe yang hanya mencakup kelas:

type Class = { new(...args: any[]): any; };

Kemudian menggunakannya:

function myFunction(myClassParam: Class) {
}

class MyClass {}

myFunction(MyClass); // ok
myFunction({}); // error

Anda seharusnya tidak mengalami kesalahan saat memasukkan sebuah kelas untuk Function karena itu seharusnya berfungsi dengan baik:

var func: Function = MyClass; // ok

Jawaban #5

Type<T> dari @angular/core adalah antarmuka yang tepat untuk Kelas.

export interface Type<T> extends Function {
    new (...args: any[]): T;
}

Anda dapat menggunakannya untuk menyimpan referensi ke kelas, bukan instansi dari kelas ini:

private classRef: Type<MyCustomClass>;

atau

private classRef: Type<any>;

Menurut latar belakang pertanyaan Anda dengan @ViewChild:

@ViewChild memungkinkan untuk menyuntikkan "string selector"/Komponen/Direktif

Tanda tangan dari Type<any> | Function | string adalah tanda tangan abstrak yang memungkinkan kita menyuntikkan semua di atas.

Artikel terkait