なぜ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;
遊び場
