javascript - Tidak dapat menggunakan deklarasi "interface" dari TypeScript di JS (tes React Native)


Saya memiliki aplikasi ReactNative dan saya sedang mencoba menulis tes menggunakan Jest. Tes saya perlu menggunakan kelas dari komponen native (react-native-nfc-manager) dan sebuah kelas yang saya butuhkan dideklarasikan seperti ini

  export interface TagEvent {
    ndefMessage: NdefRecord[];
    maxSize?: number;
    type?: string;
    techTypes?: string[];
    id?: number[];
  }

dan jika saya mencoba menggunakan definisi ini secara langsung seperti

const event = new TagEvent();

Saya mendapatkan kesalahan ini

TypeError: _reactNativeNfcManager.default bukanlah sebuah konstruktor

Saya berasal dari dunia Java jadi saya berpikir dalam hati - tentu saja tidak bisa menginstansiasi sebuah interface, ia membutuhkan sebuah kelas jadi saya menulis sebuah instance test untuk interface ini:

class TestTagEvent implements TagEvent {
    ndefMessage: NdefRecord[] = []
    maxSize?: number;
    type?: string;
    techTypes?: string[];
    id?: number[];
}

Tapi masalahnya tampaknya berbeda karena ini juga tidak berfungsi:

TypeError: _TestTagEvent.TestTagEvent bukanlah konstruktor

Apa yang saya lewatkan?

Jawaban #1

Anda tidak bisa membuat objek menggunakan sebuah interface. Interface hanyalah sekumpulan properti yang bisa digunakan untuk mendefinisikan properti yang diperlukan/tersedia dari variabel.

Untuk menggunakan antarmuka untuk menginisialisasi sebuah variabel, Anda ingin melakukan ini:

const eventVar: TagEvent;

Jika Anda ingin menggunakan TagEvent sebagai objek yang dapat diinstansiasi, Anda perlu mendefinisikannya sebagai kelas, bukan antarmuka. Sesuatu seperti ini, di mana TagEventProps adalah antarmuka TagEvent yang Anda definisikan:

class TagEvent {
  constructor(props: TagEventProps) {
    this.ndefMesssage = props.nDefMessage;
    //etc...
  }
}

Jawaban #2

Setelah percobaan lebih lanjut, masalah telah diselesaikan dengan menambahkan 'export' ke kelas. Memang, deskripsi kesalahan asli sama sekali tidak sesuai dengan penyebab utamanya.

ekspor kelas TestTagEvent mengimplementasikan TagEvent {