トランスパイルしたい(tsc

$ npx tsc
$ npx tsc src/main.ts
$ npx tsc --watch

tscコマンドで、TypeScript(.ts)をJavaScript(.js)に変換するコマンドです。 npx経由で実行することが多いです。

設定ファイル(tsconfig.json)がある場合は、自動で読み込まれます。

インストールしたい(typescript

$ npm install --save-dev typescript @types/google-apps-script

typescriptパッケージをdevDependenciesとして追加します。

@types/google-apps-scriptは、GASの型情報を使うための型定義パッケージです。 明示的なインポートは必要ありません(というか不可です)。

注釈

devDependenciesにある@typesパッケージはVS Codeが自動で認識して、補完/チェックしてくれるようです。

型をつけたい

1// 変数の定義
2const 変数名: 型名 = 
3
4// 関数の定義
5function 関数名(引数名: 型名): 戻り値の型名 {...}

: 型名で変数や関数の型を指定できます。 この型を使って、トランスパイルや静的解析で潜在的なエラーを検出します。

注釈

トランスパイルしたあとのJavaScriptには型の情報は残りません。

設定したい(tsconfig.json

{
    "compilerOptions": {
        "target": "ES2015",    // GAS V8対応
        "module": "ESNext",    // rollupでバンドル前提
        "moduleResolution": "bundler",
        "noUnusedLocals": true,    // 未使用の変数でエラー
        "noUnusedParameters": true,    // 未使用の引数でエラー
        "strict": true,    // 厳格な型チェック
        "outDir": "dist",    // 出力先ディレクトリ
        "rootDir": "src",    // ソースコードのルート
        "sourceMap": true,    // デバッグ用にソースマップを生成
        "removeComments": true    // コメントを除去
    },
    "include": [
        // トランスパイル対象
        "src/**/*"
    ],
    "exclude": [
        // トランスパイル対象外
        "node_modules",
        "coverage",
    ]
}

tsconfig.jsonでTypeScriptのトランスパイルの設定ができます。 GASのV8ランタイムはECMAScript2015(ES6 / ES2015)相当の機能しかサポートしていないため、それに合わせた設定が必要です。 ここではrollupでモジュールをバンドルし、 claspでデプロイする前提でサンプルを作成しました。

targetは、トランスパイルして出力されるJavaScriptのECMAScriptバージョンを指定するオプションです。 GAS V8の場合は"ES2015"もしくは以降のバージョンを指定します。

moduleは、トランスパイルするときに利用するモジュール形式を指定するオプションです。 rollupなどでバンドルする場合は"ESNext"を指定しておけばよさそうです。

注釈

モダンブラウザ向けにESModuleを使う場合は、"ES2015""ES2020"などを指定します。 Node.jsを使う場合は"CommonJS"を指定します。GASでは非対応です。

moduleResolutionは、importrequireで指定されたモジュールの探し方を指定するオプションです。 rollupなどのバンドラーを使う場合は"bundler"を指定します。

スクリプト設定したい(package.json

{
    "name": "...",
    "scripts": {
        "build": "tsc && rollup -c",
        "watch": "tsc --watch",
        "push": "clasp push",
        "pull": "clasp pull",
        "deploy": "npm run build && npm run push",
        "...": "..."
    }
}