ウェブサイト検索

javascript - JS(React Nativeテスト)でTypeScriptの"interface"宣言を使用できません


私はReactNativeアプリを持っており、Jestを使ってテストを書こうとしています。私のテストではネイティブコンポーネント(react-native-nfc-manager)のクラスと、必要なクラスが次のように宣言されているクラスを使う必要があります

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

そして、もし私がこの定義を直接使おうとすると

const event = new TagEvent();

このエラーが出ます

TypeError: _reactNativeNfcManager.default はコンストラクタではありません

私はJavaの世界から来ているので、自分自身にこう思います—もちろんインターフェースをインスタンス化することはできません、それにはクラスが必要です。そこで、このインターフェースのテストインスタンスを書きます:

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

しかし、問題は異なるようで、これも動作しません:

TypeError: _TestTagEvent.TestTagEvent はコンストラクタではありません

何が足りないのですか?

回答 #1

インターフェースを使ってオブジェクトを構築することはできません。インターフェースは、変数の必要なプロパティや利用可能なプロパティを定義するために使用できるプロパティのセットにすぎません。

インターフェースを使って変数を初期化するには、次のようにします:

const eventVar: TagEvent;

TagEventをインスタンス化可能なオブジェクトとして使用したい場合は、インターフェースではなくクラスとして定義する必要があります。例えば、以下のように、TagEventProps があなたが定義した TagEvent インターフェースである場合のように:

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

回答 #2

さらなる実験の結果、クラスに 'export' を追加することで問題が解決しました。確かに、元のエラーの説明は根本原因とまったく一致していません。

export class TestTagEvent implements TagEvent {