ウェブサイト検索

なぜTypeScriptでインターフェース、列挙型、または型をエクスポートしてもモジュールが作成されないのですか?


次のTSファイル(enums.ts)があり、別のファイルにインポートしようとしています

export interface ZZZ { 
  z: number
}

export const enum EnumTest {
  T2,
  T3,
  XY
}

export type EnumTest_Strings = keyof typeof EnumTest;

export function toto(){ }; // commenting this 'removes' the module

最後の行を削除すると、他のファイルで何もインポートできません。「./enums」というモジュールが見つからないと言われます。

関数を宣言せずにモジュールを作成する方法はありますか?

回答 #1

const enum の場合

あなたは tsconfig.json ファイルで preserveConstEnums を有効にしたいでしょう。

preserveConstEnums: 生成されたコードで const enum 宣言を消去しないでください。const enum は、参照の代わりに enum の値を出力することで、実行時のアプリケーションの全体的なメモリ使用量を削減する方法を提供します。

preserveConstEnums を有効にすると、この TypeScript コード:

export interface ZZZ { 
  z: number
}

export const enum EnumTest {
  T2,
  T3,
  XY
}

export type EnumTest_Strings = keyof typeof EnumTest;

これはこのJavaScriptコードの結果になります:

export var EnumTest;
(function (EnumTest) {
    EnumTest[EnumTest["T2"] = 0] = "T2";
    EnumTest[EnumTest["T3"] = 1] = "T3";
    EnumTest[EnumTest["XY"] = 2] = "XY";
})(EnumTest || (EnumTest = {}));

遊び場

通常のenumの場合

または、const enum の代わりに通常の enum を使用することもできます。

通常のenumを使うと、このTypeScriptコードは次のようになります:

export interface ZZZ { 
  z: number
}

export enum EnumTest {
  T2,
  T3,
  XY
}

export type EnumTest_Strings = keyof typeof EnumTest;

これはこのJavaScriptコードの結果になります:

export var EnumTest;
(function (EnumTest) {
    EnumTest[EnumTest["T2"] = 0] = "T2";
    EnumTest[EnumTest["T3"] = 1] = "T3";
    EnumTest[EnumTest["XY"] = 2] = "XY";
})(EnumTest || (EnumTest = {}));

遊び場

enum と const enum の違い

通常の enum は次の通りです:

  • const enumよりも包括的
  • JavaScriptオブジェクトにコンパイルされた

const enum は次の通りです:

  • 通常のenumよりも制限が厳しい
  • トランスパイル中に「away」としてコンパイルされました。

これは、const enum はランタイム中(またはライブラリとして)アクセスできなくなることを意味しますが、const enum は生成される JavaScript 内に残る影響が少ないことを意味します。例えば、console.log(EnumTest.XY) は、EnumTest が通常の enum の場合は console.log(EnumTest.XY) にトランスパイルされ、EnumTest が const enum の場合は console.log(2 /* XY */) にトランスパイルされます。

遊び場

interface と type に関して

これらは「単なる」型であり、通常の JavaScript ではいかなる形でもアクセスできないし、関連性もありません。そのため、TypeScript はデフォルトではビルド出力にこれらを含めません。tsconfig.json で declaration を有効にすれば、型宣言の形で出力に含めることは可能です。これはランタイム中や JavaScript との相互運用時のコードの動作を変えるものではありません。しかし、他の TypeScript ファイルが、トランスパイルされた JavaScript を通常の TypeScript のようにインポートできるようにします。

declaration が有効になっている場合、この TypeScript コード:

export interface ZZZ { 
  z: number
}

export enum EnumTest {
  T2,
  T3,
  XY
}

export type EnumTest_Strings = keyof typeof EnumTest;

これにより、あなたのJavaScriptファイルと一緒にこの宣言ファイル(.d.ts)が生成されます:

export interface ZZZ {
    z: number;
}
export declare enum EnumTest {
    T2 = 0,
    T3 = 1,
    XY = 2
}
export declare type EnumTest_Strings = keyof typeof EnumTest;

遊び場

関連記事