tarakonpota
@tarakonpota

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

typescriptでexport(importも) typeがうまくコンパイルされません。

「export type」「それをimportをした」コードがうまくジャバスクリプトにコンパイルされなくて困っています。

 タイプスクリプト学び始め、現在「図解!TypeScriptのツボとコツがゼッタイにわかる本「プログラミング実践編」」という書籍を参考に勉強しています。

 本書に従ってシューティングゲームの作成をしている途中です。(VScodeを用いてコーディングしていて、tsconfig.jsonを使っています。)

 タイプスクリプトで書いた「export type」、「import 〇〇 from "export typeのあるtsファイル"」が、それぞれコンパイルされると「export{};」「(importの部分はなにも反映されない)」となってしまいました。

 エラーは一切出ません。

typeをexport・importする際に問題が起こったts,jsファイル、そしてtsconfig.jsonの設定を下記に記載します。

export typeをしているtsファイル

// 空間上の位置
export type Point3D = {
  x: number; //x座標
  y: number; //y座標
  z: number; //z座標
}; //このexportはコンパイル後は空っぽ

// 平面上の位置
export type Point2D = Omit<Point3D, "z">;

// 平面上のサイズ
export type Size = Omit<Point3D, "z">;

// コンストラクタ引数
export type GameObjectParams = {
  element: HTMLElement;
  position: Point2D;
  size?: Size;
};

↑のexport typeのtsファイルをコンパイル後のジャバスクリプト

export {};

これしか残ってない...。

typeをimportしているtsファイル

import { Point2D, Size, GameObjectParams } from "../utility/type.js";
export default class GameObject {
// プロパティ
protected readonly _element: HTMLElement; //HTML要素
protected readonly _size: Size;
protected _position: Point2D;
protected readonly _timerId: number;
//......以下略

importのあるtsファイルをコンパイルして出てきたjsファイル

export default class GameObject {
// プロパティ
_element; //HTML要素
_size;
_position;
_timerId;
......以下略

コンパイルしてできたジャバスクリプトからはimportが消えてます。

tsconfig.jsonの設定

{
  "compilerOptions": {
    "target": "es2022",
    "module": "es2022",
    "rootDir": "./src",
    "outDir": "./dist",
    //"isolatedModules": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noUnusedParameters": true
  }
}

原因の心当たり

・元々入れていた拡張機能をアンインストールしたり、インストールしてどうなるか実験していた。(1回全部無効にしたりしました。)
・コンパイルしたjsファイルの方を間違って編集して保存してしまった。
といったところです。
・コンパイルの仕方が間違っている?(「tsc」とコンパイルしています。ディレクトリはあってると思います。)

 ↓ 現在使用している拡張機能の画像です。
スクリーンショット 2024-09-11 233421.png

自分で試したこと

tsファイルを保存をきちんと確かめてから何度かコンパイルしたり、再起動して確かめてみたのですが、うまくいきません...。

最後に

長文失礼しました。言葉の定義の理解が曖昧で、間違った表現をしているかもしれません、その時は申し訳ないです。わからないとことがあれば、是非教えて頂きたいです。回答よろしくお願いします。

補足

自分が現在コーディングしているプロジェクトのディレクトリのスクリーンショットを下記に掲載します。
スクリーンショット 2024-09-11 233759.png

0

2Answer

(たぶん書籍のどこかに書いてあると思いますが) TypeScript を JavaScript にコンパイルすると型に関するコードはすべて削除されます。 JavaScript は型注釈をサポートしていないからです。 TypeScript の型は tsc が型チェックをする際にだけ使われます。

1Like

Comments

  1. @tarakonpota

    Questioner

     解答ありがとうございます!
     ジャバスクリプトの方では、型注釈のコードは全て削除されるのがデフォルトなのですね。ずっと悩んでいたので、それを知れてとても助かりました!
     ありがとうございました!!

こんにちは!コメント失礼します。

TypeScriptで書かれた型に関する記述(export type)が、JavaScriptへコンパイル後に消えているとのことですね。

調べながらなので、間違っていたら申し訳ないのですが、
結論から言うと、それで問題ないです。
コンパイルは正常に作動しているし、設定ファイルも問題ない。
あなたが行なっていることは全て正しいです!

では、どうしてコンパイル後に、export typeがないのかという話に移ります。

ーさっくりいうとー
export typeやimport typeは、TypeScriptの「型情報」を扱うための仕組みです。これらは”開発時にのみ”利用されるもので、コンパイルされたJavaScriptコードには必要ないため、JavaScript側には出力されません。そのため、コンパイル後にexport {}や、import部分が消えるのは正常な動作です。

つまり、コンパイル後のJavaScriptのコードでは、export typeやimport typeの影響は全くありません。
でも、じゃあTypeScriptで書いたexport typeが無駄なのか、、というとそうではありません。開発時に、未然に余分なエラーを防ぐことができ、コードの安全性が高まります。

よくよく考えてみるとそうですよね。
TypeScriptとJavaScriptの一番の違いって、型宣言があるかないかですし。。

1Like

Comments

  1. 試しに、type export を記述しているファイル内に、適当に関数を定義してみてください。

    例えば、
    export const test = () => {
    console.log("やあ");
    }

    このファイルをコンパイル後、追加したコードのみが出力されるのではないでしょうか。

  2. @tarakonpota

    Questioner

     解答ありがとうございました!!!
    <<これらは”開発時にのみ”利用されるもので、コンパイルされたJavaScriptコードには必要ないため、JavaScript側には出力されません。
     そうなのですね!!!何か自分にミスがあると考えていたので、問題ないみたいで安心しました!!
     丁寧な解説ありがとうございます!!数日悩んでいたのでとても助かりました。
     

  3. お役に立ててよかったです!!

Your answer might help someone💌