コンパイラオプション

最上位レベル
  1. files
  2. extends
  3. include
  4. exclude、および
  5. references

"compilerOptions"

JavaScript サポート
  1. allowJs
  2. checkJs、および
  3. maxNodeModuleJsDepth
エディターサポート
  1. disableSizeLimit、および
  2. plugins
出力フォーマット
  1. noErrorTruncation
  2. preserveWatchOutput、および
  3. pretty
完全性
  1. skipDefaultLibCheck、および
  2. skipLibCheck
コマンドライン

    ルートフィールド

    最初に、tsconfig のルートオプションについて説明します。これらのオプションは、TypeScript プロジェクトまたは JavaScript プロジェクトの設定方法に関連しています。

    # Files - files

    プログラムに含めるファイルの許可リストを指定します。ファイルが見つからない場合、エラーが発生します。

    {
    "": [
    "core.ts",
    "sys.ts",
    "types.ts",
    "scanner.ts",
    "parser.ts",
    "utilities.ts",
    "binder.ts",
    "checker.ts",
    "tsc.ts"
    ]
    }

    これは、ファイル数が少ない場合に、多くのファイルを参照するためにglobを使用する必要がない場合に役立ちます。globが必要な場合は、includeを使用してください。

    # Extends - extends

    extendsの値は、継承する別の設定ファイルへのパスを含む文字列です。パスはNode.jsスタイルの解決を使用できます。

    基本ファイルの設定が最初に読み込まれ、その後、継承する設定ファイルの設定によって上書きされます。設定ファイルに見つかったすべての相対パスは、それらが由来した設定ファイルに対して解決されます。

    filesinclude、およびexcludeは、継承する設定ファイルから基本設定ファイルを *上書き* し、設定ファイル間の循環は許可されないことに注意してください。

    現在、継承から除外される最上位レベルのプロパティはreferencesのみです。

    configs/base.json:

    tsconfig.json:

    {
    "": "./configs/base",
    "": ["main.ts", "supplemental.ts"]
    }

    tsconfig.nostrictnull.json:

    {
    "": "./tsconfig",
    }
    }

    設定ファイルに見つかった相対パスを持つプロパティで、継承から除外されていないものは、それらが由来した設定ファイルに対して解決されます。

    • デフォルト

      false

    • リリース済み

      2.1

    # Include - include

    プログラムに含めるファイル名またはパターンの配列を指定します。これらのファイル名は、tsconfig.jsonファイルを含むディレクトリを基準にして解決されます。

    json
    {
    "include": ["src/**/*", "tests/**/*"]
    }

    これには以下が含まれます

    . ├── scripts ⨯ │ ├── lint.ts ⨯ │ ├── update_deps.ts ⨯ │ └── utils.ts ⨯ ├── src ✓ │ ├── client ✓ │ │ ├── index.ts ✓ │ │ └── utils.ts ✓ │ ├── server ✓ │ │ └── index.ts ✓ ├── tests ✓ │ ├── app.test.ts ✓ │ ├── utils.ts ✓ │ └── tests.d.ts ✓ ├── package.json ├── tsconfig.json └── yarn.lock

    includeexcludeは、ワイルドカード文字をサポートしてglobパターンを作成します。

    • * は、0 個以上の文字(ディレクトリセパレーターを除く)に一致します。
    • ? は、任意の1文字(ディレクトリセパレーターを除く)に一致します。
    • **/ は、任意のレベルにネストされた任意のディレクトリに一致します。

    パターンの最後のパスセグメントにファイル拡張子またはワイルドカード文字が含まれていない場合、それはディレクトリとして扱われ、そのディレクトリ内のサポートされている拡張子のファイルが含まれます(例:デフォルトでは.ts.tsx.d.tsで、allowJsがtrueに設定されている場合は.js.jsx)。

    • デフォルト

      filesが指定されている場合は[]。それ以外の場合は**/*

    • 関連
    • リリース済み

      2.0

    # Exclude - exclude

    includeの解決時にスキップするファイル名またはパターンの配列を指定します。

    **重要:** excludeは、includeの設定の結果としてどのファイルが含まれるかのみを変更します。excludeで指定されたファイルは、コード内のimport文、typesの包含、/// <referenceディレクティブ、またはfilesリストで指定されているために、コードベースの一部になる可能性があります。

    これは、ファイルをコードベースに **含めるのを防ぐ** メカニズムではありません。単にincludeの設定が検出するものを変更するだけです。

    # References - references

    プロジェクト参照は、TypeScript プログラムをより小さな部分に分割する方法です。プロジェクト参照を使用すると、ビルド時間とエディターのインタラクション時間を大幅に向上させ、コンポーネント間の論理的な分離を強化し、コードを新しい方法で整理することができます。

    参照の動作の詳細については、ハンドブックのプロジェクト参照セクションを参照してください。

    • デフォルト

      false

    コンパイラオプション

    これらのオプションはTypeScriptの設定の大部分を占め、言語の動作方法を規定します。

    #型チェック

    #到達不能コードの許可 - `allowUnreachableCode`

    設定値:

    • `undefined` (デフォルト) エディタに警告としてサジェスチョンを表示します。
    • `true` 到達不能なコードが無視されます。
    • `false` 到達不能なコードに関するコンパイラエラーが発生します。

    これらの警告は、JavaScript構文の使用によって証明可能に到達不能なコードに関するものだけです。例えば、

    ts
    function fn(n: number) {
    if (n > 5) {
    return true;
    } else {
    return false;
    }
    return true;
    }

    `"allowUnreachableCode": false` の場合

    ts
    function fn(n: number) {
    if (n > 5) {
    return true;
    } else {
    return false;
    }
    return true;
    Unreachable code detected.7027Unreachable code detected.
    }
    Try

    これは、型解析によって見かけ上到達不能と思われるコードに基づくエラーには影響しません。

    • リリース済み

      1.8

    #未使用ラベルの許可 - `allowUnusedLabels`

    設定値:

    • `undefined` (デフォルト) エディタに警告としてサジェスチョンを表示します。
    • `true` 未使用のラベルが無視されます。
    • `false` 未使用のラベルに関するコンパイラエラーが発生します。

    JavaScriptではラベルは非常にまれで、通常はオブジェクトリテラルの記述を試みたことを示しています。

    ts
    function verifyAge(age: number) {
    // Forgot 'return' statement
    if (age > 18) {
    verified: true;
    Unused label.7028Unused label.
    }
    }
    Try
    • リリース済み

      1.8

    #常に厳格モード - `alwaysStrict`

    ファイルがECMAScript厳格モードで解析され、「use strict」が各ソースファイルに対して出力されるようにします。

    ECMAScript厳格モードはES5で導入され、JavaScriptエンジンのランタイムの動作を調整してパフォーマンスを向上させ、いくつかのエラーを黙って無視する代わりに例外としてスローするようにします。

    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      2.1

    #厳密なオプションプロパティ型 - `exactOptionalPropertyTypes`

    `exactOptionalPropertyTypes` を有効にすると、TypeScriptは`?`プレフィックスを持つ`type`または`interface`のプロパティの処理に関するより厳格なルールを適用します。

    例えば、このインターフェースは、プロパティが2つの文字列のいずれか「dark」または「light」であるか、オブジェクトに存在しないことを宣言しています。

    ts
    interface UserDefaults {
    // The absence of a value represents 'system'
    colorThemeOverride?: "dark" | "light";
    }

    このフラグを有効にしないと、`colorThemeOverride` に設定できる値は「dark」、「light」、`undefined`の3つになります。

    値を`undefined`に設定すると、存在チェックの大部分のJavaScriptランタイムチェックが失敗する可能性があり、事実上偽になります。しかし、これは正確ではありません。`colorThemeOverride: undefined`は`colorThemeOverride`が定義されていないのとは異なります。例えば、`"colorThemeOverride" in settings`は、キーとして`undefined`を使用する場合と定義されていない場合で動作が異なります。

    `exactOptionalPropertyTypes` は、オプションプロパティとして提供された定義をTypeScriptが真に強制するようにします。

    ts
    const settings = getUserSettings();
    settings.colorThemeOverride = "dark";
    settings.colorThemeOverride = "light";
     
    // But not:
    settings.colorThemeOverride = undefined;
    Type 'undefined' is not assignable to type '"dark" | "light"' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the type of the target.2412Type 'undefined' is not assignable to type '"dark" | "light"' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the type of the target.
    Try
    • 推奨
    • リリース済み

      4.4

    #switch文におけるフォールスルーの禁止 - `noFallthroughCasesInSwitch`

    switch文のフォールスルーケースについてエラーを報告します。switch文内の空でないケースには、`break`、`return`、または`throw`のいずれかを含める必要があります。これにより、フォールスルーのバグを誤って出荷することがなくなります。

    ts
    const a: number = 6;
     
    switch (a) {
    case 0:
    Fallthrough case in switch.7029Fallthrough case in switch.
    console.log("even");
    case 1:
    console.log("odd");
    break;
    }
    Try
    • リリース済み

      1.8

    #暗黙的なanyの禁止 - `noImplicitAny`

    型注釈がない場合、TypeScriptは型を推論できない場合、変数の型として`any`にフォールバックします。

    これにより、一部のエラーが見過ごされる可能性があります。例えば、

    ts
    function fn(s) {
    // No error?
    console.log(s.subtr(3));
    }
    fn(42);
    Try

    `noImplicitAny`を有効にすると、TypeScriptは`any`を推論した場合に常にエラーを発行します。

    ts
    function fn(s) {
    Parameter 's' implicitly has an 'any' type.7006Parameter 's' implicitly has an 'any' type.
    console.log(s.subtr(3));
    }
    Try
    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連

    #暗黙的なオーバーライドの禁止 - `noImplicitOverride`

    継承を使用するクラスを操作する場合、サブクラスが基底クラスで名前が変更された場合、オーバーロードする関数と「同期がずれる」可能性があります。

    例えば、音楽アルバム同期システムをモデル化しているとします。

    ts
    class Album {
    download() {
    // Default behavior
    }
    }
     
    class SharedAlbum extends Album {
    download() {
    // Override to get info from many sources
    }
    }
    Try

    次に、機械学習で生成されたプレイリストのサポートを追加するときに、`Album`クラスを`setup`関数を持つようにリファクタリングします。

    ts
    class Album {
    setup() {
    // Default behavior
    }
    }
     
    class MLAlbum extends Album {
    setup() {
    // Override to get info from algorithm
    }
    }
     
    class SharedAlbum extends Album {
    download() {
    // Override to get info from many sources
    }
    }
    Try

    この場合、TypeScriptは`SharedAlbum`の`download`が基底クラスの関数をオーバーライドすることを期待していたという警告を出していません。

    `noImplicitOverride`を使用すると、オーバーライドする関数が`override`キーワードを含めるようにすることで、サブクラスが同期を失うことがないようにできます。

    `noImplicitOverride`が有効になっている次の例では、`override`がない場合に受信されるエラーを確認できます。

    ts
    class Album {
    setup() {}
    }
     
    class MLAlbum extends Album {
    override setup() {}
    }
     
    class SharedAlbum extends Album {
    setup() {}
    This member must have an 'override' modifier because it overrides a member in the base class 'Album'.4114This member must have an 'override' modifier because it overrides a member in the base class 'Album'.
    }
    Try
    • リリース済み

      4.3

    #暗黙的な戻り値の禁止 - `noImplicitReturns`

    有効にすると、TypeScriptは関数のすべてのコードパスが値を返すことを確認します。

    ts
    function lookupHeadphonesManufacturer(color: "blue" | "black"): string {
    Function lacks ending return statement and return type does not include 'undefined'.2366Function lacks ending return statement and return type does not include 'undefined'.
    if (color === "blue") {
    return "beats";
    } else {
    "bose";
    }
    }
    Try
    • リリース済み

      1.8

    #暗黙的なthisの禁止 - `noImplicitThis`

    暗黙的な`any`型の`this`式に関するエラーを発生させます。

    例えば、以下のクラスは`this.width`と`this.height`にアクセスしようとする関数を返しますが、`getAreaFunction`内の関数の`this`のコンテキストはRectangleのインスタンスではありません。

    ts
    class Rectangle {
    width: number;
    height: number;
     
    constructor(width: number, height: number) {
    this.width = width;
    this.height = height;
    }
     
    getAreaFunction() {
    return function () {
    return this.width * this.height;
    'this' implicitly has type 'any' because it does not have a type annotation.
    'this' implicitly has type 'any' because it does not have a type annotation.
    2683
    2683
    'this' implicitly has type 'any' because it does not have a type annotation.
    'this' implicitly has type 'any' because it does not have a type annotation.
    };
    }
    }
    Try
    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      2.0

    #インデックスシグネチャからのプロパティアクセスの禁止 - `noPropertyAccessFromIndexSignature`

    この設定は、「ドット」( `obj.key` )構文と「インデックス」( `obj["key"]` )構文によるフィールドへのアクセス、およびプロパティが型内で宣言される方法との間の一貫性を確保します。

    このフラグがないと、TypeScriptは定義されていないフィールドにドット構文を使用してアクセスすることを許可します。

    ts
    interface GameSettings {
    // Known up-front properties
    speed: "fast" | "medium" | "slow";
    quality: "high" | "low";
     
    // Assume anything unknown to the interface
    // is a string.
    [key: string]: string;
    }
     
    const settings = getSettings();
    settings.speed;
    (property) GameSettings.speed: "fast" | "medium" | "slow"
    settings.quality;
    (property) GameSettings.quality: "high" | "low"
     
    // Unknown key accessors are allowed on
    // this object, and are `string`
    settings.username;
    (index) GameSettings[string]: string
    Try

    フラグをオンにすると、不明なフィールドがインデックス構文ではなくドット構文を使用しているため、エラーが発生します。

    ts
    const settings = getSettings();
    settings.speed;
    settings.quality;
     
    // This would need to be settings["username"];
    settings.username;
    Property 'username' comes from an index signature, so it must be accessed with ['username'].4111Property 'username' comes from an index signature, so it must be accessed with ['username'].
    (index) GameSettings[string]: string
    Try

    このフラグの目的は、呼び出し構文において、そのプロパティが存在することにどれだけ確信があるかを意図的に示すことです。

    • リリース済み

      4.2

    #チェックされていないインデックスアクセスの禁止 - `noUncheckedIndexedAccess`

    TypeScriptには、インデックスシグネチャを介して、不明なキーを持つがオブジェクトの値が既知であるオブジェクトを記述する方法があります。

    ts
    interface EnvironmentVars {
    NAME: string;
    OS: string;
     
    // Unknown properties are covered by this index signature.
    [propName: string]: string;
    }
     
    declare const env: EnvironmentVars;
     
    // Declared as existing
    const sysName = env.NAME;
    const os = env.OS;
    const os: string
     
    // Not declared, but because of the index
    // signature, then it is considered a string
    const nodeEnv = env.NODE_ENV;
    const nodeEnv: string
    Try

    `noUncheckedIndexedAccess`を有効にすると、型内の宣言されていないフィールドに`undefined`が追加されます。

    ts
    declare const env: EnvironmentVars;
     
    // Declared as existing
    const sysName = env.NAME;
    const os = env.OS;
    const os: string
     
    // Not declared, but because of the index
    // signature, then it is considered a string
    const nodeEnv = env.NODE_ENV;
    const nodeEnv: string | undefined
    Try
    • リリース済み

      4.1

    #未使用ローカル変数の禁止 - `noUnusedLocals`

    未使用のローカル変数に関するエラーを報告します。

    ts
    const createKeyboard = (modelID: number) => {
    const defaultModelID = 23;
    'defaultModelID' is declared but its value is never read.6133'defaultModelID' is declared but its value is never read.
    return { type: "keyboard", modelID };
    };
    Try
    • リリース済み

      2.0

    #未使用パラメータの禁止 - `noUnusedParameters`

    関数内の未使用のパラメータに関するエラーを報告します。

    ts
    const createDefaultKeyboard = (modelID: number) => {
    'modelID' is declared but its value is never read.6133'modelID' is declared but its value is never read.
    const defaultModelID = 23;
    return { type: "keyboard", modelID: defaultModelID };
    };
    Try
    • リリース済み

      2.0

    #厳格モード - `strict`

    `strict`フラグは、プログラムの正確性の保証を強化する、幅広い型チェック動作を有効にします。これを有効にすることは、以下に示すすべての厳格モードファミリオプションを有効にすることと同じです。必要に応じて、個々の厳格モードファミリチェックを無効にすることができます。

    将来のバージョンのTypeScriptでは、このフラグの下でより厳格なチェックが導入される可能性があるため、TypeScriptのアップグレードによってプログラムに新しい型エラーが発生する可能性があります。適切で可能な場合、対応するフラグが追加され、その動作を無効にすることができます。

    #厳格なbind、call、apply - `strictBindCallApply`

    設定されている場合、TypeScriptは関数の組み込みメソッド`call`、`bind`、`apply`が基になる関数に対して正しい引数で呼び出されることをチェックします。

    ts
    // With strictBindCallApply on
    function fn(x: string) {
    return parseInt(x);
    }
     
    const n1 = fn.call(undefined, "10");
     
    const n2 = fn.call(undefined, false);
    Argument of type 'boolean' is not assignable to parameter of type 'string'.2345Argument of type 'boolean' is not assignable to parameter of type 'string'.
    Try

    それ以外の場合は、これらの関数は任意の引数を受け入れ、`any`を返します。

    ts
    // With strictBindCallApply off
    function fn(x: string) {
    return parseInt(x);
    }
     
    // Note: No error; return type is 'any'
    const n = fn.call(undefined, false);
    Try
    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      3.2

    #厳格な関数型 - `strictFunctionTypes`

    有効にすると、このフラグにより、関数の引数がより正しくチェックされるようになります。

    `strictFunctionTypes`をオフにした場合の基本的な例を次に示します。

    ts
    function fn(x: string) {
    console.log("Hello, " + x.toLowerCase());
    }
     
    type StringOrNumberFunc = (ns: string | number) => void;
     
    // Unsafe assignment
    let func: StringOrNumberFunc = fn;
    // Unsafe call - will crash
    func(10);
    Try

    `strictFunctionTypes`をオンにすると、エラーが正しく検出されます。

    ts
    function fn(x: string) {
    console.log("Hello, " + x.toLowerCase());
    }
     
    type StringOrNumberFunc = (ns: string | number) => void;
     
    // Unsafe assignment is prevented
    let func: StringOrNumberFunc = fn;
    Type '(x: string) => void' is not assignable to type 'StringOrNumberFunc'. Types of parameters 'x' and 'ns' are incompatible. Type 'string | number' is not assignable to type 'string'. Type 'number' is not assignable to type 'string'.2322Type '(x: string) => void' is not assignable to type 'StringOrNumberFunc'. Types of parameters 'x' and 'ns' are incompatible. Type 'string | number' is not assignable to type 'string'. Type 'number' is not assignable to type 'string'.
    Try

    この機能の開発中に、DOM内の一部のものなど、本質的に安全でないクラス階層が多数発見されました。このため、この設定は`function`構文で記述された関数にのみ適用され、`method`構文の関数には適用されません。

    ts
    type Methodish = {
    func(x: string | number): void;
    };
     
    function fn(x: string) {
    console.log("Hello, " + x.toLowerCase());
    }
     
    // Ultimately an unsafe assignment, but not detected
    const m: Methodish = {
    func: fn,
    };
    m.func(10);
    Try
    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      2.6

    #厳格なnullチェック - `strictNullChecks`

    `strictNullChecks`が`false`の場合、`null`と`undefined`は言語によって事実上無視されます。これにより、ランタイムで予期しないエラーが発生する可能性があります。

    `strictNullChecks`が`true`の場合、`null`と`undefined`にはそれぞれ独自の型があり、具体的な値が期待される場所でそれらを使用しようとすると型エラーが発生します。

    例えば、このTypeScriptコードでは、`users.find`は実際にユーザーを見つけるという保証はありませんが、まるで保証されているかのようにコードを記述できます。

    ts
    declare const loggedInUsername: string;
     
    const users = [
    { name: "Oby", age: 12 },
    { name: "Heera", age: 32 },
    ];
     
    const loggedInUser = users.find((u) => u.name === loggedInUsername);
    console.log(loggedInUser.age);
    Try

    `strictNullChecks`を`true`に設定すると、`loggedInUser`を使用する前にその存在を保証していないというエラーが発生します。

    ts
    declare const loggedInUsername: string;
     
    const users = [
    { name: "Oby", age: 12 },
    { name: "Heera", age: 32 },
    ];
     
    const loggedInUser = users.find((u) => u.name === loggedInUsername);
    console.log(loggedInUser.age);
    'loggedInUser' is possibly 'undefined'.18048'loggedInUser' is possibly 'undefined'.
    Try

    2番目の例は、配列の`find`関数がこの簡略化のようなものだから失敗しました。

    ts
    // When strictNullChecks: true
    type Array = {
    find(predicate: (value: any, index: number) => boolean): S | undefined;
    };
    // When strictNullChecks: false the undefined is removed from the type system,
    // allowing you to write code which assumes it always found a result
    type Array = {
    find(predicate: (value: any, index: number) => boolean): S;
    };
    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      2.0

    #厳格なプロパティ初期化 - `strictPropertyInitialization`

    trueに設定すると、クラスプロパティが宣言されているがコンストラクタで設定されていない場合に、TypeScriptはエラーを発生させます。

    ts
    class UserAccount {
    name: string;
    accountType = "user";
     
    email: string;
    Property 'email' has no initializer and is not definitely assigned in the constructor.2564Property 'email' has no initializer and is not definitely assigned in the constructor.
    address: string | undefined;
     
    constructor(name: string) {
    this.name = name;
    // Note that this.email is not set
    }
    }
    Try

    上記の例では、

    • `this.name`は具体的に設定されています。
    • `this.accountType`はデフォルトで設定されています。
    • `this.email`は設定されておらず、エラーが発生します。
    • `this.address`は、`undefined`の可能性があるとして宣言されているため、設定する必要はありません。
    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      2.7

    #catch節変数にunknownを使用 - `useUnknownInCatchVariables`

    TypeScript 4.0では、catch節の変数の型を`any`から`unknown`に変更できるサポートが追加されました。次のようなコードを許可します。

    ts
    try {
    // ...
    } catch (err) {
    // We have to verify err is an
    // error before using it as one.
    if (err instanceof Error) {
    console.log(err.message);
    }
    }
    Try

    このパターンにより、スローされるオブジェクトが事前にErrorサブクラスであると保証できないため、エラー処理コードがより包括的になります。`useUnknownInCatchVariables`フラグを有効にすると、追加の構文(`: unknown`)や、この動作を強制しようとするリンタールールは必要ありません。

    • 推奨
    • デフォルト

      `strict` の場合 `true`、それ以外の場合は `false`。

    • 関連
    • リリース済み

      4.4

    #モジュール

    #任意の拡張子の許可 - `allowArbitraryExtensions`

    TypeScript 5.0 では、インポートパスが既知の JavaScript または TypeScript ファイル拡張子で終わっていない場合、コンパイラは `{file basename}.d.{extension}.ts` という形式の宣言ファイルを探します。例えば、バンドラープロジェクトで CSS ローダーを使用している場合、これらのスタイルシートの宣言ファイルを作成(または生成)することが必要になる場合があります。

    css
    /* app.css */
    .cookie-banner {
    display: none;
    }
    ts
    // app.d.css.ts
    declare const css: {
    cookieBanner: string;
    };
    export default css;
    ts
    // App.tsx
    import styles from "./app.css";
    styles.cookieBanner; // string

    デフォルトでは、このインポートは、TypeScript がこのファイルタイプを理解しておらず、ランタイムがインポートをサポートしていない可能性があることを知らせるエラーを発生させます。しかし、ランタイムまたはバンドラーで処理するように設定している場合は、新しい `--allowArbitraryExtensions` コンパイラオプションを使用してエラーを抑制できます。

    従来、`app.d.css.ts` ではなく `app.css.d.ts` という名前の宣言ファイルを追加することで、同様の効果が得られることがよくありました。ただし、これは Node の CommonJS に対する `require` の解決ルールを通じて機能していました。厳密に言うと、前者は `app.css.js` という名前の JavaScript ファイルの宣言ファイルとして解釈されます。Node の ESM サポートでは相対ファイルのインポートに拡張子が含まれている必要があるため、`--moduleResolution node16` または `nodenext` の下では、ESM ファイル内のこの例で TypeScript はエラーになります。

    詳細については、この機能の提案対応するプルリクエスト を参照してください。

      # TS 拡張子のインポート許可 - `allowImportingTsExtensions`

      `--allowImportingTsExtensions` を使用すると、TypeScript ファイルは `.ts`、`.mts`、`.tsx` などの TypeScript 固有の拡張子を使用して相互にインポートできます。

      このフラグは、`--noEmit` または `--emitDeclarationOnly` が有効になっている場合のみ許可されます。これは、これらのインポートパスは JavaScript 出力ファイルのランタイムでは解決できないためです。ここでは、リゾルバー(バンドラー、ランタイム、またはその他のツールなど)がこれらの `.ts` ファイル間のインポートを機能させることを想定しています。

        # UMD グローバルアクセス許可 - `allowUmdGlobalAccess`

        `allowUmdGlobalAccess` を true に設定すると、モジュールファイル内からグローバルとして UMD エクスポートにアクセスできます。モジュールファイルとは、インポートと/またはエクスポートを持つファイルです。このフラグがない場合、UMD モジュールからのエクスポートを使用するには、インポート宣言が必要です。

        このフラグの使用例としては、特定のライブラリ(jQuery や Lodash など)がランタイムで常に使用可能であることがわかっている Web プロジェクトがありますが、インポートを使用してアクセスできない場合が挙げられます。

        • リリース済み

          3.5

        # ベース URL - `baseUrl`

        ベアスペシファイアモジュール名の解決元のベースディレクトリを設定します。例えば、次のディレクトリ構造の場合

        project ├── ex.ts ├── hello │ └── world.ts └── tsconfig.json

        `"baseUrl": "./"` を使用すると、TypeScript は `tsconfig.json` と同じフォルダから始まるファイルを探します。

        ts
        import { helloWorld } from "hello/world";
        console.log(helloWorld);

        この解決は、`node_modules` からの検索よりも優先されます。

        この機能は、ブラウザでの AMD モジュールローダーとの連携で使用するために設計されており、その他のコンテキストでは推奨されません。TypeScript 4.1 以降、`paths` を使用する場合、`baseUrl` を設定する必要がなくなりました。

          # カスタム条件 - `customConditions`

          `--customConditions` は、TypeScript が `package.json` の `exports` または `imports` フィールドから解決する際に成功する追加の 条件 のリストを受け取ります。これらの条件は、リゾルバーがデフォルトで使用している既存の条件に追加されます。

          例えば、`tsconfig.json` にこのフィールドが次のように設定されている場合

          jsonc
          {
          "compilerOptions": {
          "target": "es2022",
          "moduleResolution": "bundler",
          "customConditions": ["my-condition"]
          }
          }

          `package.json` で `exports` または `imports` フィールドが参照されるたびに、TypeScript は `my-condition` という名前の条件を考慮します。

          したがって、次の `package.json` を持つパッケージからインポートする場合

          jsonc
          {
          // ...
          "exports": {
          ".": {
          "my-condition": "./foo.mjs",
          "node": "./bar.mjs",
          "import": "./baz.mjs",
          "require": "./biz.mjs"
          }
          }
          }

          TypeScript は `foo.mjs` に対応するファイルを探そうとします。

          このフィールドは、`--moduleResolution` の `node16`、`nodenext`、`bundler` オプションの下でのみ有効です。

          # モジュール - `module`

          プログラムのモジュールシステムを設定します。TypeScript の `module` オプションの理論リファレンスページ を参照してください。最新の Node.js プロジェクトでは、`nodenext` を使用することを強くお勧めします。

          `module` を変更すると、リファレンスページも参照されている `moduleResolution` に影響します。

          このファイルの出力例を次に示します。

          ts
          // @filename: index.ts
          import { valueOfPi } from "./constants";
           
          export const twoPi = valueOfPi * 2;
          Try

          CommonJS

          ts
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          const constants_1 = require("./constants");
          exports.twoPi = constants_1.valueOfPi * 2;
           
          Try

          UMD

          ts
          (function (factory) {
          if (typeof module === "object" && typeof module.exports === "object") {
          var v = factory(require, exports);
          if (v !== undefined) module.exports = v;
          }
          else if (typeof define === "function" && define.amd) {
          define(["require", "exports", "./constants"], factory);
          }
          })(function (require, exports) {
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          const constants_1 = require("./constants");
          exports.twoPi = constants_1.valueOfPi * 2;
          });
           
          Try

          AMD

          ts
          define(["require", "exports", "./constants"], function (require, exports, constants_1) {
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          exports.twoPi = constants_1.valueOfPi * 2;
          });
           
          Try

          System

          ts
          System.register(["./constants"], function (exports_1, context_1) {
          "use strict";
          var constants_1, twoPi;
          var __moduleName = context_1 && context_1.id;
          return {
          setters: [
          function (constants_1_1) {
          constants_1 = constants_1_1;
          }
          ],
          execute: function () {
          exports_1("twoPi", twoPi = constants_1.valueOfPi * 2);
          }
          };
          });
           
          Try

          ESNext

          ts
          import { valueOfPi } from "./constants";
          export const twoPi = valueOfPi * 2;
           
          Try

          ES2015/ES6/ES2020/ES2022

          ts
          import { valueOfPi } from "./constants";
          export const twoPi = valueOfPi * 2;
           
          Try

          ES2015/ES6 の基本機能に加えて、ES2020動的 `import``import.meta` をサポートし、ES2022 はさらに トップレベル `await` のサポートを追加しています。

          node16/nodenext

          4.7 以降で使用できる `node16` と `nodenext` モードは、Node の ネイティブ ECMAScript モジュールサポート と統合されます。出力される JavaScript は、ファイル拡張子と最寄りの `package.json` の `type` 設定の値に応じて、`CommonJS` または `ES2020` 出力を使用します。モジュールの解決も異なります。ハンドブックモジュールリファレンス で詳細を確認できます。

          None

          ts
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.twoPi = void 0;
          const constants_1 = require("./constants");
          exports.twoPi = constants_1.valueOfPi * 2;
           
          Try

          # モジュール解決 - `moduleResolution`

          モジュール解決戦略を指定します。

          • 最新のNode.jsバージョンには'node16'または'nodenext'を使用します。Node.js v12以降は、ECMAScript importとCommonJS requireの両方をサポートしており、異なるアルゴリズムを使用して解決されます。これらのmoduleResolution値は、対応するmodule値と組み合わせて、出力されたJavaScriptコードにimportまたはrequireのどちらが含まれるかに基づいて、各解決に適切なアルゴリズムを選択します。

          • CommonJS requireのみをサポートするv10より前のNode.jsバージョンには'node10'(以前は'node'と呼ばれていました)を使用します。最新のコードではnode10を使用する必要はほとんどないでしょう。

          • バンドラーで使用するには'bundler'を使用します。node16およびnodenextと同様に、このモードはpackage.jsonの"imports""exports"をサポートしますが、Node.jsの解決モードとは異なり、bundlerはインポートの相対パスにファイル拡張子を付ける必要がありません。

            bundlerrequire呼び出しの解決をサポートしていません。TypeScriptファイルでは、import mod = require("foo")構文は禁止されます。JavaScriptファイルでは、require呼び出しはエラーになりませんが、常に型any(またはグローバルなrequire関数の環境宣言で宣言されている戻り値)を返します。

          • 'classic'は、1.6リリース前のTypeScriptで使用されていました。classicは使用しないでください。

          TypeScriptのモジュール解決の理論と各オプションの詳細を説明したリファレンスページがあります。

          # モジュールサフィックス - moduleSuffixes

          モジュールの解決時に検索するファイル名サフィックスのデフォルトリストをオーバーライドする方法を提供します。

          {
          "moduleSuffixes": [".ios", ".native", ""]
          }
          }

          上記の構成を考慮すると、次のインポートのようなものになります。

          ts
          import * as foo from "./foo";

          TypeScriptは、相対ファイル./foo.ios.ts./foo.native.ts、最後に./foo.tsを検索します。

          moduleSuffixesの空文字列""は、TypeScriptが./foo.tsも検索するために必要です。

          この機能は、各ターゲットプラットフォームが異なるmoduleSuffixesを持つ別々のtsconfig.jsonを使用できるReact Nativeプロジェクトで役立ちます。

          • リリース済み

            4.7

          # 解決なし - noResolve

          デフォルトでは、TypeScriptは初期のファイルセットでimportおよび<referenceディレクティブを調べ、解決されたこれらのファイルをプログラムに追加します。

          noResolveが設定されている場合、このプロセスは実行されません。ただし、importステートメントは、有効なモジュールに解決されるかどうかまだチェックされるため、他の方法でこれが満たされていることを確認する必要があります。

            # パス - paths

            設定されている場合baseUrlを基準とした、そうでない場合はtsconfigファイル自体を基準とした参照先をインポートに再マッピングする一連のエントリです。moduleResolutionリファレンスページには、pathsに関するより詳細な説明があります。

            pathsを使用すると、TypeScriptがrequire/importでのインポートをどのように解決するかを宣言できます。

            {
            "": {
            "jquery": ["./vendor/jquery/dist/jquery"]
            }
            }
            }

            これにより、import "jquery"を記述し、ローカルで正しい型をすべて取得できるようになります。

            {
            "": {
            "app/*": ["./src/app/*"],
            "config/*": ["./src/app/_config/*"],
            "environment/*": ["./src/environments/*"],
            "shared/*": ["./src/app/_shared/*"],
            "helpers/*": ["./src/helpers/*"],
            "tests/*": ["./src/tests/*"]
            },
            }

            この場合、TypeScriptファイルリゾルバーに、コードを見つけるための複数のカスタムプレフィックスをサポートするように指示できます。

            この機能は、tscによって出力されるインポートパスの方法を変更しないため、pathsは、別のツールがこのマッピングを持っており、実行時またはバンドル時にそれを使用するようにTypeScriptに通知するためだけに使用してください。

              # JSONモジュールの解決 - resolveJsonModule

              .json拡張子を持つモジュールのインポートを許可します。これは、ノードプロジェクトでは一般的な方法です。これには、静的JSON形状に基づいてimportの型を生成することも含まれます。

              TypeScriptはデフォルトではJSONファイルの解決をサポートしていません。

              ts
              // @filename: settings.json
              Cannot find module './settings.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.2732Cannot find module './settings.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
              {
              "repo": "TypeScript",
              "dry": false,
              "debug": false
              }
              // @filename: index.ts
              import settings from "./settings.json";
               
              settings.debug === true;
              settings.dry === 2;
              Try

              このオプションを有効にすると、JSONをインポートし、そのJSONファイル内の型を検証できます。

              ts
              // @filename: settings.json
              {
              "repo": "TypeScript",
              "dry": false,
              This comparison appears to be unintentional because the types 'boolean' and 'number' have no overlap.2367This comparison appears to be unintentional because the types 'boolean' and 'number' have no overlap.
              "debug": false
              }
              // @filename: index.ts
              import settings from "./settings.json";
               
              settings.debug === true;
              settings.dry === 2;
              Try

                # package.jsonエクスポートの解決 - resolvePackageJsonExports

                --resolvePackageJsonExportsは、node_modules内のパッケージから読み取るたびに、TypeScriptがpackage.jsonファイルのexportsフィールドを参照するように強制します。

                このオプションは、--moduleResolutionnode16nodenextbundlerオプションではtrueにデフォルト設定されています。

                # package.jsonインポートの解決 - resolvePackageJsonImports

                --resolvePackageJsonImportsは、祖先ディレクトリにpackage.jsonが含まれているファイルから始まるルックアップを実行する際に、TypeScriptがpackage.jsonファイルのimportsフィールドを参照するように強制します。

                このオプションは、--moduleResolutionnode16nodenextbundlerオプションではtrueにデフォルト設定されています。

                # ルートディレクトリ - rootDir

                デフォルト:すべての非宣言入力ファイルの最長の共通パス。compositeが設定されている場合、デフォルトはtsconfig.jsonファイルを含むディレクトリになります。

                TypeScriptがファイルをコンパイルすると、出力ディレクトリには入力ディレクトリにあるものと同じディレクトリ構造が保持されます。

                たとえば、いくつかの入力ファイルがあるとします。

                MyProj ├── tsconfig.json ├── core │ ├── a.ts │ ├── b.ts │ ├── sub │ │ ├── c.ts ├── types.d.ts

                rootDirの推論された値は、すべての非宣言入力ファイルの最長の共通パスであり、この場合はcore/です。

                outDirdistの場合、TypeScriptは次のツリーを書き込みます。

                MyProj ├── dist │ ├── a.js │ ├── b.js │ ├── sub │ │ ├── c.js

                ただし、coreを出力ディレクトリ構造の一部として意図していた可能性があります。tsconfig.jsonrootDir: "."を設定することにより、TypeScriptは次のツリーを書き込みます。

                MyProj ├── dist │ ├── core │ │ ├── a.js │ │ ├── b.js │ │ ├── sub │ │ │ ├── c.js

                重要なのは、rootDirコンパイルの一部となるファイルには影響しませんincludeexclude、またはfiles tsconfig.json設定とは相互作用しません。

                TypeScriptは、outDirの外部のディレクトリに出力ファイルを書き込んだり、ファイルの発行をスキップすることはありません。このため、rootDirは、発行する必要があるすべてのファイルがrootDirパスの下にあることも強制します。

                たとえば、次のツリーがあるとします。

                MyProj ├── tsconfig.json ├── core │ ├── a.ts │ ├── b.ts ├── helpers.ts

                rootDircoreとして、そしてinclude*として指定することはエラーです。これは、outDir外部に出力する必要があるファイル(../helpers.jsつまりhelpers.ts)を作成するためです。

                • デフォルト

                  入力ファイルのリストから計算されます。

                • リリース済み

                  1.5

                # ルートディレクトリ - rootDirs

                rootDirsを使用すると、単一のルートとして機能する多くの「仮想」ディレクトリがあることをコンパイラに通知できます。これにより、コンパイラは、これらの「仮想」ディレクトリ内で、まるで1つのディレクトリにマージされたかのように、相対モジュールインポートを解決できます。

                たとえば

                src └── views └── view1.ts (can import "./template1", "./view2`) └── view2.ts (can import "./template1", "./view1`) generated └── templates └── views └── template1.ts (can import "./view1", "./view2")
                {
                "": ["src/views", "generated/templates/views"]
                }
                }

                これは、TypeScriptがJavaScriptを出力する方法には影響しません。実行時にそれらの相対パスで動作できると仮定しているだけです。

                rootDirsは、TypeScriptまたはJavaScriptではないファイルに別の「型レイヤー」を提供し、別のフォルダに生成された.d.tsファイルの場所を提供することで使用できます。この手法は、必ずしもコードではないファイルのimportを使用するバンドルされたアプリケーションで役立ちます。

                sh
                src
                └── index.ts
                └── css
                └── main.css
                └── navigation.css
                generated
                └── css
                └── main.css.d.ts
                └── navigation.css.d.ts
                {
                "": ["src", "generated"]
                }
                }

                この手法では、コードではないソースファイルの型を事前に生成できます。インポートは、ソースファイルの場所に基づいて自然に機能します。たとえば、./src/index.tsはファイル./src/css/main.cssをインポートでき、TypeScriptは対応する生成された宣言ファイルによって、そのファイルタイプに対するバンドラの動作を認識します。

                ts
                // @filename: index.ts
                import { appClass } from "./main.css";
                Try
                • デフォルト

                  入力ファイルのリストから計算されます。

                • リリース済み

                  2.0

                # 型ルート - typeRoots

                デフォルトでは、すべての表示可能な@types」パッケージがコンパイルに含まれます。任意の包含フォルダのnode_modules/@types内のパッケージは表示可能と見なされます。たとえば、./node_modules/@types/../node_modules/@types/../../node_modules/@types/など内のパッケージを意味します。

                typeRootsが指定されている場合、typeRootsの下にあるパッケージのみが含まれます。たとえば

                {
                "": ["./typings", "./vendor/types"]
                }
                }

                この構成ファイルには、./typings./vendor/typesの下にあるすべてのパッケージが含まれ、./node_modules/@typesのパッケージは含まれません。すべてのパスの基準はtsconfig.jsonです。

                # 型 - types

                デフォルトでは、すべての表示可能な@types」パッケージがコンパイルに含まれます。任意の包含フォルダのnode_modules/@types内のパッケージは表示可能と見なされます。たとえば、./node_modules/@types/../node_modules/@types/../../node_modules/@types/など内のパッケージを意味します。

                typesが指定されている場合、リストされているパッケージのみがグローバルスコープに含まれます。例えば

                {
                "": ["node", "jest", "express"]
                }
                }

                このtsconfig.jsonファイルには、./node_modules/@types/node./node_modules/@types/jest、および./node_modules/@types/expressのみが含まれます。node_modules/@types/*の下にある他のパッケージは含まれません。

                これはどのような影響がありますか?

                このオプションは、アプリケーションコードに@types/*がどのように含まれるかには影響しません。たとえば、上記のcompilerOptionsの例で、次のようなコードがあった場合

                ts
                import * as moment from "moment";
                moment().format("MMMM Do YYYY, h:mm:ss a");

                momentのインポートは完全に型付けされます。

                このオプションを設定した場合、`types`配列にモジュールを含めないことで

                • プロジェクトにグローバル変数を追加しません(例:ノードのprocess、Jestのexpectなど)。
                • エクスポートが自動インポートの推奨事項として表示されなくなります。

                この機能はtypeRootsとは異なり、含める正確な型のみを指定することに関するものであり、typeRootsは特定のフォルダを含めたいことを指定できます。

                #Emit

                # Declaration - declaration

                プロジェクト内のすべてのTypeScriptまたはJavaScriptファイルに対して.d.tsファイルを生成します。これらの.d.tsファイルは、モジュールの外部APIを記述する型定義ファイルです。.d.tsファイルを使用すると、TypeScriptなどのツールは、型指定されていないコードに対してインテリセンスと正確な型を提供できます。

                declarationtrueに設定して、このTypeScriptコードでコンパイラを実行すると

                ts
                export let helloWorld = "hi";
                Try

                次のようなindex.jsファイルが生成されます。

                ts
                export let helloWorld = "hi";
                 
                Try

                対応するhelloWorld.d.tsと共に

                ts
                export declare let helloWorld: string;
                 
                Try

                JavaScriptファイルの.d.tsファイルを使用する際には、emitDeclarationOnlyを使用するか、outDirを使用してJavaScriptファイルが上書きされないようにする必要があります。

                # Declaration Dir - declarationDir

                宣言ファイルが出力されるルートディレクトリを設定する方法を提供します。

                example ├── index.ts ├── package.json └── tsconfig.json

                このtsconfig.jsonを使用すると

                {
                "": true,
                "": "./types"
                }
                }

                index.tsのd.tsがtypesフォルダに配置されます。

                example ├── index.js ├── index.ts ├── package.json ├── tsconfig.json └── types └── index.d.ts

                # Declaration Map - declarationMap

                元の.tsソースファイルにマップバックする.d.tsファイルのソースマップを生成します。これにより、VS Codeなどのエディターは、「定義へ移動」などの機能を使用する際に、元の.tsファイルに移動できます。

                プロジェクト参照を使用している場合は、これを有効にすることを強く検討する必要があります。

                • リリース済み

                  2.9

                # Downlevel Iteration - downlevelIteration

                ダウンレベル化とは、TypeScriptが以前のバージョンのJavaScriptに変換することです。このフラグは、古いJavaScriptランタイムで最新のJavaScriptが新しい概念をどのように反復処理するかについて、より正確な実装をサポートするために使用されます。

                ECMAScript 6では、for / ofループ(for (el of arr))、配列スプレッド([a, ...b])、引数スプレッド(fn(...args))、Symbol.iteratorなど、いくつかの新しい反復プリミティブが追加されました。downlevelIterationを使用すると、Symbol.iteratorの実装が存在する場合、これらの反復プリミティブをES5環境でより正確に使用できます。

                例:for / ofへの影響

                このTypeScriptコードを使用すると

                ts
                const str = "Hello!";
                for (const s of str) {
                console.log(s);
                }
                Try

                downlevelIterationを有効にしないと、任意のオブジェクトのfor / ofループは従来のforループにダウンレベル化されます。

                ts
                "use strict";
                var str = "Hello!";
                for (var _i = 0, str_1 = str; _i < str_1.length; _i++) {
                var s = str_1[_i];
                console.log(s);
                }
                 
                Try

                これは多くの場合、人々が期待することですが、ECMAScript反復プロトコルに完全に準拠しているわけではありません。絵文字(😜)などの一部の文字列は、.lengthが2(またはそれ以上)ですが、for-ofループでは1単位として反復処理する必要があります。Jonathan Newによるこのブログ投稿で、より詳細な説明を参照してください。

                downlevelIterationを有効にすると、TypeScriptはSymbol.iteratorの実装(ネイティブまたはポリフィル)をチェックするヘルパー関数を使用します。この実装がない場合は、インデックスベースの反復処理に戻ります。

                ts
                "use strict";
                var __values = (this && this.__values) || function(o) {
                var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
                if (m) return m.call(o);
                if (o && typeof o.length === "number") return {
                next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
                }
                };
                throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
                };
                var e_1, _a;
                var str = "Hello!";
                try {
                for (var str_1 = __values(str), str_1_1 = str_1.next(); !str_1_1.done; str_1_1 = str_1.next()) {
                var s = str_1_1.value;
                console.log(s);
                }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                try {
                if (str_1_1 && !str_1_1.done && (_a = str_1.return)) _a.call(str_1);
                }
                finally { if (e_1) throw e_1.error; }
                }
                 
                Try

                tslibimportHelpersを介して使用して、インラインJavaScriptの量を減らすこともできます。

                ts
                "use strict";
                var __values = (this && this.__values) || function(o) {
                var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
                if (m) return m.call(o);
                if (o && typeof o.length === "number") return {
                next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
                }
                };
                throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
                };
                var e_1, _a;
                var str = "Hello!";
                try {
                for (var str_1 = __values(str), str_1_1 = str_1.next(); !str_1_1.done; str_1_1 = str_1.next()) {
                var s = str_1_1.value;
                console.log(s);
                }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                try {
                if (str_1_1 && !str_1_1.done && (_a = str_1.return)) _a.call(str_1);
                }
                finally { if (e_1) throw e_1.error; }
                }
                 
                Try

                注:downlevelIterationを有効にしても、Symbol.iteratorがランタイムに存在しない場合、準拠性は向上しません。

                例:配列スプレッドへの影響

                これは配列スプレッドです。

                js
                // Make a new array whose elements are 1 followed by the elements of arr2
                const arr = [1, ...arr2];

                説明によると、ES5へのダウンレベル化は簡単そうです。

                js
                // The same, right?
                const arr = [1].concat(arr2);

                しかし、これは特定のまれなケースでは明らかに異なります。

                たとえば、ソース配列に1つ以上のアイテムが欠落している場合(穴が含まれている場合)、スプレッド構文は空のアイテムをすべてundefinedで置き換えますが、.concatはそのまま残します。

                js
                // Make an array where the element at index 1 is missing
                let arrayWithHole = ["a", , "c"];
                let spread = [...arrayWithHole];
                let concatenated = [].concat(arrayWithHole);
                console.log(arrayWithHole);
                // [ 'a', <1 empty item>, 'c' ]
                console.log(spread);
                // [ 'a', undefined, 'c' ]
                console.log(concatenated);
                // [ 'a', <1 empty item>, 'c' ]

                for / ofと同様に、downlevelIterationSymbol.iterator(存在する場合)を使用して、ES 6の動作をより正確にエミュレートします。

                # Emit BOM - emitBOM

                出力ファイルの書き込み時に、TypeScriptがバイトオーダーマーク(BOM)を出力するかどうかを制御します。一部のランタイム環境では、JavaScriptファイルを正しく解釈するためにBOMが必要です。一方、BOMが存在しないことが求められる環境もあります。falseのデフォルト値は、変更する理由がない限り、一般的に最適です。

                  # Emit Declaration Only - emitDeclarationOnly

                  .d.tsファイルのみを出力し、.jsファイルは出力しません。

                  この設定は、次の2つの場合に役立ちます。

                  • TypeScript以外のトランスパイラを使用してJavaScriptを生成している場合。
                  • コンシューマー向けにd.tsファイルのみを生成するためにTypeScriptを使用している場合。

                  # Import Helpers - importHelpers

                  特定のダウンレベル化操作では、TypeScriptはクラスの拡張、配列やオブジェクトのスプレッド、非同期操作などの操作にいくつかのヘルパーコードを使用します。デフォルトでは、これらのヘルパーはそれらを使用するファイルに挿入されます。同じヘルパーが多くの異なるモジュールで使用されている場合、コードの重複が発生する可能性があります。

                  importHelpersフラグがオンの場合、これらのヘルパー関数は代わりにtslibモジュールからインポートされます。tslibモジュールがランタイムでインポート可能であることを確認する必要があります。これはモジュールにのみ影響し、グローバルスクリプトファイルはモジュールのインポートを試みません。

                  たとえば、このTypeScriptの場合

                  ts
                  export function fn(arr: number[]) {
                  const arr2 = [1, ...arr];
                  }

                  downlevelIterationimportHelpersを有効にしてもfalseのままです。

                  ts
                  var __read = (this && this.__read) || function (o, n) {
                  var m = typeof Symbol === "function" && o[Symbol.iterator];
                  if (!m) return o;
                  var i = m.call(o), r, ar = [], e;
                  try {
                  while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
                  }
                  catch (error) { e = { error: error }; }
                  finally {
                  try {
                  if (r && !r.done && (m = i["return"])) m.call(i);
                  }
                  finally { if (e) throw e.error; }
                  }
                  return ar;
                  };
                  var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
                  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
                  if (ar || !(i in from)) {
                  if (!ar) ar = Array.prototype.slice.call(from, 0, i);
                  ar[i] = from[i];
                  }
                  }
                  return to.concat(ar || Array.prototype.slice.call(from));
                  };
                  export function fn(arr) {
                  var arr2 = __spreadArray([1], __read(arr), false);
                  }
                   
                  Try

                  次に、downlevelIterationimportHelpersの両方を有効にすると

                  ts
                  import { __read, __spreadArray } from "tslib";
                  export function fn(arr) {
                  var arr2 = __spreadArray([1], __read(arr), false);
                  }
                   
                  Try

                  独自の関数の実装を提供する場合は、noEmitHelpersを使用できます。

                  # Imports Not Used As Values - importsNotUsedAsValues

                  verbatimModuleSyntaxに置き換えられました。

                  このフラグはimportの動作を制御し、3つの異なるオプションがあります。

                  • remove:型のみを参照するimport文を削除するデフォルトの動作。

                  • preserve:値または型が決して使用されないすべてのimport文を保持します。これにより、インポート/副作用が保持される可能性があります。

                  • error:すべてのインポートを保持しますが(preserveオプションと同じ)、値インポートが型としてのみ使用されている場合にエラーが発生します。これは、値が誤ってインポートされていないことを確認したいが、副作用インポートを明示的にしたい場合に役立つ場合があります。

                  このフラグは、import typeを使用して、JavaScriptに決して出力されるべきではないimport文を明示的に作成できるため機能します。

                  # Inline Source Map - inlineSourceMap

                  設定されている場合、ソースマップを提供するために.js.mapファイルを出力する代わりに、TypeScriptはソースマップの内容を.jsファイルに埋め込みます。これによりJSファイルが大きくなりますが、場合によっては便利です。たとえば、.mapファイルの提供が許可されていないWebサーバーでJSファイルをデバッグする場合などです。

                  sourceMapとは相互に排他的です。

                  たとえば、このTypeScriptの場合

                  ts
                  const helloWorld = "hi";
                  console.log(helloWorld);

                  このJavaScriptに変換されます。

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                   
                  Try

                  inlineSourceMap を有効にしてビルドを有効にすると、ファイルの一番下に、そのファイルのソースマップを含むコメントがあります。

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMifQ==
                  Try
                  • リリース済み

                    1.5

                  # インラインソース - inlineSources

                  設定されている場合、TypeScript は .ts ファイルの元のコンテンツを、ソースマップの sourcesContent プロパティを使用して、ソースマップに埋め込み文字列として含めます。inlineSourceMap と同様のケースで役立つことがよくあります。

                  sourceMap または inlineSourceMap のいずれかを設定する必要があります。

                  たとえば、このTypeScriptの場合

                  ts
                  const helloWorld = "hi";
                  console.log(helloWorld);
                  Try

                  デフォルトでは、このJavaScriptに変換されます。

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                   
                  Try

                  inlineSourcesinlineSourceMap を有効にしてビルドを有効にすると、ファイルの一番下に、そのファイルのソースマップを含むコメントがあります。inlineSourceMap の例とは末尾が異なることに注意してください。これは、ソースマップに元のソースコードも含まれるようになったためです。

                  ts
                  "use strict";
                  const helloWorld = "hi";
                  console.log(helloWorld);
                  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBoZWxsb1dvcmxkID0gXCJoaVwiO1xuY29uc29sZS5sb2coaGVsbG9Xb3JsZCk7Il19
                  Try
                  • リリース済み

                    1.5

                  # マップルート - mapRoot

                  デバッガーが生成された場所ではなく、マップファイルを見つける場所を指定します。この文字列はソースマップ内でそのまま扱われます。例:

                  {
                  "": true,
                  "": "https://my-website.com/debug/sourcemaps/"
                  }
                  }

                  index.js のソースマップが https://my-website.com/debug/sourcemaps/index.js.map にあることを宣言します。

                    # 改行 - newLine

                    ファイルを出力する際に使用する改行シーケンスを指定します:「CRLF」(dos) または「LF」(unix)。

                    • デフォルト

                      プラットフォーム固有。

                    • 許可されるもの
                      • crlf

                      • lf

                    • リリース済み

                      1.5

                    # 出力なし - noEmit

                    JavaScriptソースコード、ソースマップ、宣言などのコンパイラ出力ファイルを出力しません。

                    これにより、Babelswc などの別のツールが、TypeScriptファイルをJavaScript環境で実行できるファイルに変換するスペースが作成されます。

                    その後、TypeScriptをエディターの統合ツールとして、そしてソースコードの型チェッカーとして使用できます。

                      # ヘルパー出力なし - noEmitHelpers

                      importHelpers を使用してヘルパーをインポートする代わりに、使用するヘルパーのグローバルスコープに実装を提供し、ヘルパー関数の出力全体を完全にオフにすることができます。

                      たとえば、ES5でこのasync関数は、awaitのような関数とgeneratorのような関数を実行する必要があります。

                      ts
                      const getAPI = async (url: string) => {
                      // Get API
                      return {};
                      };
                      Try

                      これはかなりの量のJavaScriptを作成します。

                      ts
                      "use strict";
                      var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
                      function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
                      return new (P || (P = Promise))(function (resolve, reject) {
                      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
                      function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
                      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
                      step((generator = generator.apply(thisArg, _arguments || [])).next());
                      });
                      };
                      var __generator = (this && this.__generator) || function (thisArg, body) {
                      var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
                      return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
                      function verb(n) { return function (v) { return step([n, v]); }; }
                      function step(op) {
                      if (f) throw new TypeError("Generator is already executing.");
                      while (g && (g = 0, op[0] && (_ = 0)), _) try {
                      if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                      if (y = 0, t) op = [op[0] & 2, t.value];
                      switch (op[0]) {
                      case 0: case 1: t = op; break;
                      case 4: _.label++; return { value: op[1], done: false };
                      case 5: _.label++; y = op[1]; op = [0]; continue;
                      case 7: op = _.ops.pop(); _.trys.pop(); continue;
                      default:
                      if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                      if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                      if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                      if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                      if (t[2]) _.ops.pop();
                      _.trys.pop(); continue;
                      }
                      op = body.call(thisArg, _);
                      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
                      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
                      }
                      };
                      var getAPI = function (url) { return __awaiter(void 0, void 0, void 0, function () {
                      return __generator(this, function (_a) {
                      // Get API
                      return [2 /*return*/, {}];
                      });
                      }); };
                       
                      Try

                      これは、このフラグを使用して独自のグローバルに置き換えることができます。

                      ts
                      "use strict";
                      var getAPI = function (url) { return __awaiter(void 0, void 0, void 0, function () {
                      return __generator(this, function (_a) {
                      // Get API
                      return [2 /*return*/, {}];
                      });
                      }); };
                       
                      Try

                      # エラー発生時の出力なし - noEmitOnError

                      エラーが報告された場合、JavaScriptソースコード、ソースマップ、宣言などのコンパイラ出力ファイルを出力しません。

                      これはデフォルトでfalseになっており、変更されたコードの結果を別の環境で確認する前にすべてのエラーを解決する必要がない監視環境でTypeScriptを使用しやすくします。

                      • リリース済み

                        1.4

                      # 出力ディレクトリ - outDir

                      指定されている場合、.js(および.d.ts.js.mapなど)ファイルは、このディレクトリに出力されます。元のソースファイルのディレクトリ構造は保持されます。計算されたルートが意図したものと異なる場合はrootDirを参照してください。

                      指定されていない場合、.jsファイルは、生成元の.tsファイルと同じディレクトリに出力されます。

                      sh
                      $ tsc
                      example
                      ├── index.js
                      └── index.ts

                      このようなtsconfig.jsonの場合

                      {
                      "": "dist"
                      }
                      }

                      これらの設定でtscを実行すると、ファイルは指定されたdistフォルダに移動されます。

                      sh
                      $ tsc
                      example
                      ├── dist
                      │ └── index.js
                      ├── index.ts
                      └── tsconfig.json

                      # 出力ファイル - outFile

                      指定されている場合、すべてのグローバル(非モジュール)ファイルは、指定された単一出力ファイルに連結されます。

                      modulesystemまたはamdの場合、すべてのモジュールファイルも、すべてのグローバルコンテンツの後にこのファイルに連結されます。

                      注:moduleNoneSystem、またはAMDでない限り、outFileは使用できません。このオプションは、CommonJSまたはES6モジュールのバンドルには使用できません

                      # 定数列挙型を保持 - preserveConstEnums

                      生成されたコードでconst enum宣言を削除しません。const enumは、参照ではなく列挙値を出力することにより、アプリケーションの実行時のメモリフットプリント全体を削減する方法を提供します。

                      たとえば、このTypeScriptの場合

                      ts
                      const enum Album {
                      JimmyEatWorldFutures = 1,
                      TubRingZooHypothesis = 2,
                      DogFashionDiscoAdultery = 3,
                      }
                       
                      const selectedAlbum = Album.JimmyEatWorldFutures;
                      if (selectedAlbum === Album.JimmyEatWorldFutures) {
                      console.log("That is a great choice.");
                      }
                      Try

                      デフォルトのconst enumの動作は、任意のAlbum.Somethingを対応する数値リテラルに変換し、JavaScriptから列挙型への参照を完全に削除することです。

                      ts
                      "use strict";
                      const selectedAlbum = 1 /* Album.JimmyEatWorldFutures */;
                      if (selectedAlbum === 1 /* Album.JimmyEatWorldFutures */) {
                      console.log("That is a great choice.");
                      }
                       
                      Try

                      preserveConstEnumstrueに設定すると、enumは実行時に存在し、数値も出力されます。

                      ts
                      "use strict";
                      var Album;
                      (function (Album) {
                      Album[Album["JimmyEatWorldFutures"] = 1] = "JimmyEatWorldFutures";
                      Album[Album["TubRingZooHypothesis"] = 2] = "TubRingZooHypothesis";
                      Album[Album["DogFashionDiscoAdultery"] = 3] = "DogFashionDiscoAdultery";
                      })(Album || (Album = {}));
                      const selectedAlbum = 1 /* Album.JimmyEatWorldFutures */;
                      if (selectedAlbum === 1 /* Album.JimmyEatWorldFutures */) {
                      console.log("That is a great choice.");
                      }
                       
                      Try

                      これにより、そのようなconst enumは基本的にソースコードの機能のみになり、実行時のトレースはありません。

                      • デフォルト

                        isolatedModules の場合はtrue。それ以外の場合はfalse

                      # 値インポートを保持 - preserveValueImports

                      verbatimModuleSyntaxに置き換えられました。

                      TypeScriptがインポートを使用していることを検出できない場合があります。たとえば、次のコードを考えてください。

                      ts
                      import { Animal } from "./animal.js";
                      eval("console.log(new Animal().isDangerous())");

                      またはSvelteやVueなどの「HTMLに変換」言語を使用するコード。preserveValueImportsは、未使用に見える場合でも、TypeScriptがインポートの削除を防ぎます。

                      isolatedModules と組み合わせると、インポートされた型は型専用としてマークする必要があります。これは、一度に単一のファイルを処理するコンパイラーは、インポートが未使用に見える値であるか、実行時クラッシュを回避するために削除する必要がある型であるかを判断する方法がないためです。

                      # コメントの削除 - removeComments

                      JavaScriptへの変換時にTypeScriptファイルからすべてのコメントを削除します。デフォルトはfalseです。

                      たとえば、これはJSDocコメントを持つTypeScriptファイルです。

                      ts
                      /** The translation of 'Hello world' into Portuguese */
                      export const helloWorldPTBR = "Olá Mundo";

                      removeCommentstrueに設定されている場合

                      ts
                      export const helloWorldPTBR = "Olá Mundo";
                       
                      Try

                      removeCommentsを設定しないか、falseに設定しない場合

                      ts
                      /** The translation of 'Hello world' into Portuguese */
                      export const helloWorldPTBR = "Olá Mundo";
                       
                      Try

                      つまり、コメントはJavaScriptコードに表示されます。

                        # ソースマップ - sourceMap

                        ソースマップファイルの生成を有効にします。これらのファイルにより、デバッガーやその他のツールは、実際に生成されたJavaScriptファイルを使用する場合でも、元のTypeScriptソースコードを表示できます。ソースマップファイルは、対応する.js出力ファイルの横に.js.map(または.jsx.map)ファイルとして出力されます。

                        .jsファイルには、外部ツールにファイルの場所を示すソースマップコメントが含まれます。例:

                        ts
                        // helloWorld.ts
                        export declare const helloWorld = "hi";

                        sourceMaptrueに設定してコンパイルすると、次のJavaScriptファイルが作成されます。

                        js
                        // helloWorld.js
                        "use strict";
                        Object.defineProperty(exports, "__esModule", { value: true });
                        exports.helloWorld = "hi";
                        //# sourceMappingURL=// helloWorld.js.map

                        そして、このJSONマップも生成されます。

                        json
                        // helloWorld.js.map
                        {
                        "version": 3,
                        "file": "ex.js",
                        "sourceRoot": "",
                        "sources": ["../ex.ts"],
                        "names": [],
                        "mappings": ";;AAAa,QAAA,UAAU,GAAG,IAAI,CAAA"
                        }

                          # ソースルート - sourceRoot

                          デバッガーが相対ソースの場所ではなく、TypeScriptファイルを見つける場所を指定します。この文字列は、パスまたはURLを使用できるソースマップ内でそのまま扱われます。

                          {
                          "": true,
                          "": "https://my-website.com/debug/source/"
                          }
                          }

                          index.jsのソースファイルがhttps://my-website.com/debug/source/index.tsにあることを宣言します。

                            # 内部コードの削除 - stripInternal

                            JSDocコメントに@internalアノテーションが付いているコードの宣言を出力しません。これは内部コンパイラオプションです。コンパイラは結果が有効であることを確認しないため、自己責任で使用してください。d.tsファイル内で追加の可視性レベルを処理するツールを探している場合は、api-extractorを参照してください。

                            ts
                            /**
                            * Days available in a week
                            * @internal
                            */
                            export const daysInAWeek = 7;
                             
                            /** Calculate how much someone earns in a week */
                            export function weeklySalary(dayRate: number) {
                            return daysInAWeek * dayRate;
                            }
                            Try

                            フラグがfalse(デフォルト)に設定されている場合

                            ts
                            /**
                            * Days available in a week
                            * @internal
                            */
                            export declare const daysInAWeek = 7;
                            /** Calculate how much someone earns in a week */
                            export declare function weeklySalary(dayRate: number): number;
                             
                            Try

                            stripInternaltrueに設定すると、出力されるd.tsは編集されます。

                            ts
                            /** Calculate how much someone earns in a week */
                            export declare function weeklySalary(dayRate: number): number;
                             
                            Try

                            JavaScript出力は変わりません。

                            • 内部

                            #JavaScriptサポート

                            # JS許可 - allowJs

                            .tsファイルと.tsxファイルだけでなく、プロジェクト内でJavaScriptファイルのインポートを許可します。たとえば、このJSファイル

                            js
                            // @filename: card.js
                            export const defaultCardDeck = "Heart";
                            Try

                            TypeScriptファイルにインポートされると、エラーが発生します。

                            ts
                            // @filename: index.ts
                            import { defaultCardDeck } from "./card";
                             
                            console.log(defaultCardDeck);
                            Try

                            allowJsを有効にすると正常にインポートされます。

                            ts
                            // @filename: index.ts
                            import { defaultCardDeck } from "./card";
                             
                            console.log(defaultCardDeck);
                            Try

                            このフラグは、.tsファイルと.tsxファイルが既存のJavaScriptファイルと共存できるようにすることで、TypeScriptファイルをJSプロジェクトに段階的に追加する方法として使用できます。

                            declarationemitDeclarationOnly と共に使用して、JSファイルの宣言を作成することもできます。

                            # JSチェック - checkJs

                            allowJs と連携して動作します。checkJsが有効になっていると、JavaScriptファイルのエラーが報告されます。これは、プロジェクトに含まれるすべてのJavaScriptファイルの先頭に// @ts-checkを含めることと同等です。

                            たとえば、これはTypeScriptに付属するparseFloat型定義によると、正しくないJavaScriptです。

                            js
                            // parseFloat only takes a string
                            module.exports.pi = parseFloat(3.142);

                            TypeScriptモジュールにインポートされると

                            ts
                            // @filename: constants.js
                            module.exports.pi = parseFloat(3.142);
                             
                            // @filename: index.ts
                            import { pi } from "./constants";
                            console.log(pi);
                            Try

                            エラーは発生しません。ただし、checkJsをオンにすると、JavaScriptファイルからのエラーメッセージが表示されます。

                            ts
                            // @filename: constants.js
                            Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.
                            module.exports.pi = parseFloat(3.142);
                             
                            // @filename: index.ts
                            import { pi } from "./constants";
                            console.log(pi);
                            Try

                            # 最大Node Module JS 深度 - maxNodeModuleJsDepth

                            node_modules配下を検索してJavaScriptファイルを読み込む際の、最大依存関係深度です。

                            このフラグは、allowJsが有効になっている場合にのみ使用でき、node_modules内のすべてのJavaScriptに対してTypeScriptが型推論を行う場合に使用します。

                            理想的には、これは0(デフォルト)のままにしておくべきであり、モジュールの形状はd.tsファイルを使用して明示的に定義する必要があります。ただし、速度と正確性の犠牲を払ってでもこれを有効にしたいケースもあります。

                              #エディタサポート

                              # サイズ制限の無効化 - disableSizeLimit

                              非常に大規模なJavaScriptプロジェクトを扱う際に発生する可能性のあるメモリブロートの問題を回避するために、TypeScriptが割り当てるメモリの量の上限が設けられています。このフラグをオンにすると、その制限が解除されます。

                                # プラグイン - plugins

                                エディタ内で実行する言語サービスプラグインのリストです。

                                言語サービスプラグインは、既存のTypeScriptファイルに基づいてユーザーに追加情報を提供する方法です。TypeScriptとエディタ間の既存のメッセージを強化したり、独自のエラーメッセージを提供したりすることができます。

                                たとえば

                                • ts-sql-plugin — テンプレート文字列SQLビルダーを使用したSQLのリンティングを追加します。
                                • typescript-styled-plugin — テンプレート文字列内のCSSのリンティングを提供します。
                                • typescript-eslint-language-service — コンパイラの出力内にeslintのエラーメッセージと修正を提供します。
                                • ts-graphql-plugin — GraphQLクエリテンプレート文字列内の検証と自動補完を提供します。

                                VS Codeでは、拡張機能が言語サービスプラグインを自動的に含めることができ、そのため、tsconfig.jsonで定義する必要なく、エディタでいくつかのプラグインが実行されている場合があります。

                                  #相互運用制約

                                  # 合成デフォルトインポートの許可 - allowSyntheticDefaultImports

                                  trueに設定すると、allowSyntheticDefaultImportsにより、次のようなインポートを記述できます。

                                  ts
                                  import React from "react";

                                  次の代わりに

                                  ts
                                  import * as React from "react";

                                  モジュールがデフォルトエクスポートを明示的に指定していない場合。

                                  たとえば、allowSyntheticDefaultImportsがtrueではない場合

                                  ts
                                  // @filename: utilFunctions.js
                                  Module '"/home/runner/work/TypeScript-Website/TypeScript-Website/utilFunctions"' has no default export.1192Module '"/home/runner/work/TypeScript-Website/TypeScript-Website/utilFunctions"' has no default export.
                                  const getStringLength = (str) => str.length;
                                   
                                  module.exports = {
                                  getStringLength,
                                  };
                                   
                                  // @filename: index.ts
                                  import utils from "./utilFunctions";
                                   
                                  const count = utils.getStringLength("Check JS");
                                  Try

                                  このコードは、インポートできるdefaultオブジェクトがないためエラーが発生します。そうあるべきのように感じられるにもかかわらずです。便宜上、Babelなどのトランスパイラは、デフォルトが作成されていない場合に自動的にデフォルトを作成します。モジュールを次のようにより似せます。

                                  js
                                  // @filename: utilFunctions.js
                                  const getStringLength = (str) => str.length;
                                  const allFunctions = {
                                  getStringLength,
                                  };
                                  module.exports = allFunctions;
                                  module.exports.default = allFunctions;

                                  このフラグは、TypeScriptによって出力されるJavaScriptには影響しません。型チェックのみに使用されます。このオプションにより、モジュールのデフォルトエクスポートの使用をより人間工学的にするために、追加コードが出力されるBabelとTypeScriptの動作が一致するようになります。

                                  # ESモジュール相互運用性 - esModuleInterop

                                  デフォルトでは(esModuleInteropがfalseの場合、または設定されていない場合)、TypeScriptはCommonJS/AMD/UMDモジュールをES6モジュールと同様に扱います。これを行う際に、特に2つの部分が欠陥のある仮定であることが判明しました。

                                  • import * as moment from "moment"のような名前空間インポートは、const moment = require("moment")と同じように動作します。

                                  • import moment from "moment"のようなデフォルトインポートは、const moment = require("moment").defaultと同じように動作します。

                                  この不一致により、次の2つの問題が発生します。

                                  • ES6モジュールの仕様では、名前空間インポート(import * as x)はオブジェクトのみであると規定されていますが、TypeScriptが= require("x")と同じように扱うことで、インポートが関数として扱われ、呼び出し可能になることを許可していました。これは仕様に従って無効です。

                                  • ES6モジュールの仕様に正確ではありますが、CommonJS/AMD/UMDモジュールを持つほとんどのライブラリは、TypeScriptの実装ほど厳密に準拠していませんでした。

                                  esModuleInteropをオンにすると、TypeScriptによってトランスパイルされたコードのこれらの両方の問題が修正されます。最初の変更はコンパイラの動作を変更し、2番目の変更は、出力されたJavaScriptの互換性を確保するためのシムを提供する2つの新しいヘルパー関数によって修正されます。

                                  ts
                                  import * as fs from "fs";
                                  import _ from "lodash";
                                  fs.readFileSync("file.txt", "utf8");
                                  _.chunk(["a", "b", "c", "d"], 2);

                                  esModuleInteropが無効の場合

                                  ts
                                  "use strict";
                                  Object.defineProperty(exports, "__esModule", { value: true });
                                  const fs = require("fs");
                                  const lodash_1 = require("lodash");
                                  fs.readFileSync("file.txt", "utf8");
                                  lodash_1.default.chunk(["a", "b", "c", "d"], 2);
                                   
                                  Try

                                  esModuleInteroptrueに設定されている場合

                                  ts
                                  "use strict";
                                  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
                                  if (k2 === undefined) k2 = k;
                                  var desc = Object.getOwnPropertyDescriptor(m, k);
                                  if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
                                  desc = { enumerable: true, get: function() { return m[k]; } };
                                  }
                                  Object.defineProperty(o, k2, desc);
                                  }) : (function(o, m, k, k2) {
                                  if (k2 === undefined) k2 = k;
                                  o[k2] = m[k];
                                  }));
                                  var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
                                  Object.defineProperty(o, "default", { enumerable: true, value: v });
                                  }) : function(o, v) {
                                  o["default"] = v;
                                  });
                                  var __importStar = (this && this.__importStar) || function (mod) {
                                  if (mod && mod.__esModule) return mod;
                                  var result = {};
                                  if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
                                  __setModuleDefault(result, mod);
                                  return result;
                                  };
                                  var __importDefault = (this && this.__importDefault) || function (mod) {
                                  return (mod && mod.__esModule) ? mod : { "default": mod };
                                  };
                                  Object.defineProperty(exports, "__esModule", { value: true });
                                  const fs = __importStar(require("fs"));
                                  const lodash_1 = __importDefault(require("lodash"));
                                  fs.readFileSync("file.txt", "utf8");
                                  lodash_1.default.chunk(["a", "b", "c", "d"], 2);
                                   
                                  Try

                                  注記:名前空間インポートimport * as fs from "fs"は、所有されている(基本的にオブジェクトに設定されたプロパティであり、プロトタイプチェーン経由ではない)プロパティのみをインポートされたオブジェクトで考慮します。インポートしているモジュールが継承されたプロパティを使用してAPIを定義している場合は、デフォルトインポート形式(import fs from "fs")を使用するか、esModuleInteropを無効にする必要があります。

                                  注記importHelpersを有効にすることで、JSの出力をより短くできます。

                                  ts
                                  "use strict";
                                  Object.defineProperty(exports, "__esModule", { value: true });
                                  const tslib_1 = require("tslib");
                                  const fs = tslib_1.__importStar(require("fs"));
                                  const lodash_1 = tslib_1.__importDefault(require("lodash"));
                                  fs.readFileSync("file.txt", "utf8");
                                  lodash_1.default.chunk(["a", "b", "c", "d"], 2);
                                   
                                  Try

                                  esModuleInteropを有効にすると、allowSyntheticDefaultImportsも有効になります。

                                  # ファイル名のケースの一貫性を強制 - forceConsistentCasingInFileNames

                                  TypeScriptは、実行されているファイルシステムの大文字と小文字の規則に従います。一部の開発者が大文字と小文字を区別するファイルシステムで作業し、他の開発者がそうでない場合、これは問題になる可能性があります。ファイルが./FileManager.tsを指定してfileManager.tsをインポートしようとすると、大文字と小文字を区別しないファイルシステムではファイルが見つかりますが、大文字と小文字を区別するファイルシステムでは見つかりません。

                                  このオプションが設定されている場合、プログラムがディスク上のケースとは異なるケースでファイルを含めようとすると、TypeScriptはエラーを発行します。

                                  • 推奨
                                  • デフォルト

                                    true

                                  # 分離されたモジュール - isolatedModules

                                  TypeScriptを使用してTypeScriptコードからJavaScriptコードを作成できますが、Babelなどの他のトランスパイラを使用してこれを行うことも一般的です。ただし、他のトランスパイラは一度に1つのファイルのみを操作するため、完全な型システムを理解することに依存するコード変換を適用できません。この制限は、一部のビルドツールで使用されるTypeScriptのts.transpileModule APIにも適用されます。

                                  これらの制限により、const enumnamespaceなどのいくつかのTypeScript機能でランタイムの問題が発生する可能性があります。isolatedModulesフラグを設定すると、単一ファイルのトランスパイルプロセスによって正しく解釈できない特定のコードを記述した場合に、TypeScriptが警告します。

                                  コードの動作を変更したり、TypeScriptのチェックと出力プロセスの動作を変更したりすることはありません。

                                  isolatedModulesが有効になっている場合に機能しないコードの例をいくつか示します。

                                  値以外の識別子のエクスポート

                                  TypeScriptでは、をインポートしてから、後でエクスポートできます。

                                  ts
                                  import { someType, someFunction } from "someModule";
                                   
                                  someFunction();
                                   
                                  export { someType, someFunction };
                                  Try

                                  someTypeには値がないため、出力されるexportはそれをエクスポートしようと試みません(これはJavaScriptではランタイムエラーになります)。

                                  js
                                  export { someFunction };

                                  単一ファイルのトランスパイラは、someTypeが値を生成するかどうかを知らないため、型のみを参照する名前をエクスポートすることはエラーです。

                                  モジュール以外のファイル

                                  isolatedModulesが設定されている場合、名前空間はモジュール内でのみ許可されます(つまり、何らかの形式のimport/exportがあります)。名前空間がモジュール以外のファイルで見つかった場合、エラーが発生します。

                                  ts
                                  namespace Instantiated {
                                  Namespaces are not allowed in global script files when 'isolatedModules' is enabled. If this file is not intended to be a global script, set 'moduleDetection' to 'force' or add an empty 'export {}' statement.1280Namespaces are not allowed in global script files when 'isolatedModules' is enabled. If this file is not intended to be a global script, set 'moduleDetection' to 'force' or add an empty 'export {}' statement.
                                  export const x = 1;
                                  }
                                  Try

                                  この制限は.d.tsファイルには適用されません。

                                  const enumメンバへの参照

                                  TypeScriptでは、const enumメンバを参照すると、その参照は出力されたJavaScriptで実際の値に置き換えられます。このTypeScriptを変更します。

                                  ts
                                  declare const enum Numbers {
                                  Zero = 0,
                                  One = 1,
                                  }
                                  console.log(Numbers.Zero + Numbers.One);
                                  Try

                                  このJavaScriptへ

                                  ts
                                  "use strict";
                                  console.log(0 + 1);
                                   
                                  Try

                                  これらのメンバの値を知らずに、他のトランスパイラはNumbersへの参照を置き換えることができません。これは、そのままにしておくとランタイムエラーになります(ランタイム時にNumbersオブジェクトがないためです)。このため、isolatedModulesが設定されている場合、周囲のconst enumメンバを参照することはエラーです。

                                    これは、シンボリックリンクの実際のパスの解決を行わないNode.jsの同じフラグを反映するためです。

                                    このフラグは、Webpackのresolve.symlinksオプションとは反対の動作を示します(つまり、TypeScriptのpreserveSymlinksをtrueに設定することは、Webpackのresolve.symlinksをfalseに設定することと等しく、その逆も同様です)。

                                    これが有効になっていると、モジュールとパッケージへの参照(例:import/// <reference type="..." />ディレクティブ)はすべて、シンボリックリンクが解決されるパスではなく、シンボリックリンクファイルの場所に相対的に解決されます。

                                      # 字句モジュール構文 - verbatimModuleSyntax

                                      デフォルトでは、TypeScriptはimport elisionと呼ばれる処理を行います。基本的に、次のような記述を行うと

                                      ts
                                      import { Car } from "./car";
                                      export function drive(car: Car) {
                                      // ...
                                      }

                                      TypeScriptは、型にのみインポートを使用していることを検出し、インポート全体を削除します。出力されたJavaScriptは次のようになります。

                                      js
                                      export function drive(car) {
                                      // ...
                                      }

                                      ほとんどの場合、これは適切です。なぜなら、Car./carからエクスポートされる値ではない場合、ランタイムエラーが発生するからです。

                                      しかし、特定のエッジケースでは複雑さが増します。たとえば、import "./car";のようなステートメントがないことに注意してください。インポートは完全に削除されました。それは実際には、副作用があるかどうかなどのモジュールにとって違いを生みます。

                                      TypeScriptのJavaScript向けEmit戦略には、さらにいくつかの複雑なレイヤーがあります。インポートの削除は、インポートの使用方法だけでなく、値の宣言方法にも依存することが多いためです。そのため、以下のコードのようなものが

                                      ts
                                      export { Car } from "./car";

                                      保持されるべきか、削除されるべきかは必ずしも明確ではありません。Carclassのようなもので宣言されている場合、結果のJavaScriptファイルに保持できます。しかし、Cartypeエイリアスまたはinterfaceとしてのみ宣言されている場合、JavaScriptファイルはCarをエクスポートすべきではありません。

                                      TypeScriptはファイル全体の情報に基づいてこれらのEmitの決定を行うことができるかもしれませんが、すべてのコンパイラがそうできるわけではありません。

                                      インポートとエクスポートのtype修飾子は、これらの状況をいくらか改善します。インポートまたはエクスポートが型解析のみに使用されており、type修飾子を使用してJavaScriptファイルで完全に削除できるかどうかを明示的に指定できます。

                                      ts
                                      // This statement can be dropped entirely in JS output
                                      import type * as car from "./car";
                                      // The named import/export 'Car' can be dropped in JS output
                                      import { type Car } from "./car";
                                      export { type Car } from "./car";

                                      type修飾子はそれだけではあまり役に立ちません。デフォルトでは、モジュール削除は依然としてインポートを削除し、typeと通常のインポートとエクスポートを区別する強制手段はありません。そのため、TypeScriptには、type修飾子を使用することを保証する--importsNotUsedAsValuesフラグ、モジュールの削除動作を一部防ぐ--preserveValueImportsフラグ、TypeScriptコードが異なるコンパイラ間で動作することを保証する--isolatedModulesフラグがあります。残念ながら、これら3つのフラグの詳細を理解することは難しく、予期しない動作をするエッジケースもいくつかあります。

                                      TypeScript 5.0では、状況を簡素化するために--verbatimModuleSyntaxという新しいオプションが導入されました。ルールははるかにシンプルです。type修飾子がないインポートまたはエクスポートはそのまま残されます。type修飾子を使用しているものは完全に削除されます。

                                      ts
                                      // Erased away entirely.
                                      import type { A } from "a";
                                      // Rewritten to 'import { b } from "bcd";'
                                      import { b, type c, type d } from "bcd";
                                      // Rewritten to 'import {} from "xyz";'
                                      import { type xyz } from "xyz";

                                      この新しいオプションを使用すると、見たままが結果となります。

                                      ただし、モジュールの相互運用性に関しては、いくつかの影響があります。このフラグの下では、設定またはファイル拡張子が異なるモジュールシステムを示している場合、ECMAScriptのimportexportrequire呼び出しに書き換えられません。代わりに、エラーが発生します。requiremodule.exportsを使用するコードをEmitする必要がある場合は、ES2015より前のTypeScriptのモジュール構文を使用する必要があります。

                                      入力TypeScript 出力JavaScript
                                      ts
                                      import foo = require("foo");
                                      js
                                      const foo = require("foo");
                                      ts
                                      function foo() {}
                                      function bar() {}
                                      function baz() {}
                                      export = {
                                      foo,
                                      bar,
                                      baz,
                                      };
                                      js
                                      function foo() {}
                                      function bar() {}
                                      function baz() {}
                                      module.exports = {
                                      foo,
                                      bar,
                                      baz,
                                      };

                                      これは制限事項ではありますが、いくつかの問題をより明確にするのに役立ちます。たとえば、--module node16の下でpackage.jsontypeフィールドを設定することを忘れることは非常に一般的です。その結果、開発者はESモジュールではなくCommonJSモジュールを意図せずに書き始め、驚くべきルックアップルールとJavaScript出力が得られます。この新しいフラグにより、構文が意図的に異なるため、使用しているファイルの種類について意図的に行うことができます。

                                      --verbatimModuleSyntax--importsNotUsedAsValuesおよび--preserveValueImportsよりも一貫性のあるストーリーを提供するため、これら2つの既存のフラグは廃止予定となっています。

                                      詳細については、元のプルリクエストその提案に関するIssueを参照してください。

                                        #後方互換性

                                        #文字セット - charset

                                        以前のバージョンのTypeScriptでは、これはディスクからテキストファイルを読み取る際に使用されるエンコードを制御していました。現在、TypeScriptはUTF-8エンコーディングを想定していますが、UTF-16(BEおよびLE)またはUTF-8 BOMを正しく検出します。

                                        • 非推奨
                                        • デフォルト

                                          utf8

                                        #Keyof文字列のみ - keyofStringsOnly

                                        このフラグは、文字列インデックスシグネチャを持つ型に適用した場合、keyof型演算子がstring | numberではなくstringを返すように変更します。

                                        このフラグは、TypeScript 2.9リリース以前の動作を維持するのに役立つように使用されます。

                                        • 非推奨
                                        • リリース済み

                                          2.9

                                        #暗黙的なUse Strictなし - noImplicitUseStrict

                                        これは必要ありません。デフォルトでは、モジュールファイルをES6以外のターゲットにEmitする場合、TypeScriptはファイルの先頭に"use strict";プロローグをEmitします。この設定では、プロローグが無効になります。

                                          #厳密なジェネリックチェックなし - noStrictGenericChecks

                                          TypeScriptは、2つのジェネリック関数を比較する際に型パラメータを統一します。

                                          ts
                                          type A = <T, U>(x: T, y: U) => [T, U];
                                          type B = <S>(x: S, y: S) => [S, S];
                                           
                                          function f(a: A, b: B) {
                                          b = a; // Ok
                                          a = b; // Error
                                          Type 'B' is not assignable to type 'A'. Types of parameters 'y' and 'y' are incompatible. Type 'U' is not assignable to type 'T'. 'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.2322Type 'B' is not assignable to type 'A'. Types of parameters 'y' and 'y' are incompatible. Type 'U' is not assignable to type 'T'. 'T' could be instantiated with an arbitrary type which could be unrelated to 'U'.
                                          }
                                          Try

                                          このフラグを使用して、そのチェックを削除できます。

                                          • リリース済み

                                            2.4

                                          #出力 - out

                                          outFileを使用してください。

                                          outオプションは、予測可能でも一貫性も無い方法で最終的なファイルの場所を計算します。このオプションは後方互換性のためにのみ保持されており、非推奨です。

                                          #超過プロパティエラーの抑制 - suppressExcessPropertyErrors

                                          これにより、次の例に示すような超過プロパティエラーの報告が無効になります。

                                          ts
                                          type Point = { x: number; y: number };
                                          const p: Point = { x: 1, y: 3, m: 10 };
                                          Type '{ x: number; y: number; m: number; }' is not assignable to type 'Point'. Object literal may only specify known properties, and 'm' does not exist in type 'Point'.2322Type '{ x: number; y: number; m: number; }' is not assignable to type 'Point'. Object literal may only specify known properties, and 'm' does not exist in type 'Point'.
                                          Try

                                          このフラグは、TypeScript 1.6における新しいオブジェクトリテラルのより厳格なチェックへの移行を支援するために追加されました。

                                          最新のコードベースでこのフラグを使用することはお勧めしません。必要な場合は、// @ts-ignoreを使用して個々のケースを抑制できます。

                                            #暗黙的なAnyインデックスエラーの抑制 - suppressImplicitAnyIndexErrors

                                            suppressImplicitAnyIndexErrorsをオンにすると、オブジェクトのインデックス作成時の暗黙的なanyに関するエラーの報告が抑制されます(次の例を参照)。

                                            ts
                                            const obj = { x: 10 };
                                            console.log(obj["foo"]);
                                            Element implicitly has an 'any' type because expression of type '"foo"' can't be used to index type '{ x: number; }'. Property 'foo' does not exist on type '{ x: number; }'.7053Element implicitly has an 'any' type because expression of type '"foo"' can't be used to index type '{ x: number; }'. Property 'foo' does not exist on type '{ x: number; }'.
                                            Try

                                            suppressImplicitAnyIndexErrorsを使用することは非常に極端なアプローチです。代わりに@ts-ignoreコメントを使用することをお勧めします。

                                            ts
                                            const obj = { x: 10 };
                                            // @ts-ignore
                                            console.log(obj["foo"]);
                                            Try

                                            #言語と環境

                                            #デコレータメタデータのEmit - emitDecoratorMetadata

                                            モジュールreflect-metadataで動作するデコレータの型メタデータのEmitに対する実験的なサポートを有効にします。

                                            たとえば、ここにTypeScriptがあります。

                                            ts
                                            function LogMethod(
                                            target: any,
                                            propertyKey: string | symbol,
                                            descriptor: PropertyDescriptor
                                            ) {
                                            console.log(target);
                                            console.log(propertyKey);
                                            console.log(descriptor);
                                            }
                                             
                                            class Demo {
                                            @LogMethod
                                            public foo(bar: number) {
                                            // do nothing
                                            }
                                            }
                                             
                                            const demo = new Demo();
                                            Try

                                            emitDecoratorMetadataがtrueに設定されていない場合(デフォルト)、EmitされたJavaScriptは次のようになります。

                                            ts
                                            "use strict";
                                            var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
                                            var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
                                            if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
                                            else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
                                            return c > 3 && r && Object.defineProperty(target, key, r), r;
                                            };
                                            function LogMethod(target, propertyKey, descriptor) {
                                            console.log(target);
                                            console.log(propertyKey);
                                            console.log(descriptor);
                                            }
                                            class Demo {
                                            foo(bar) {
                                            // do nothing
                                            }
                                            }
                                            __decorate([
                                            LogMethod
                                            ], Demo.prototype, "foo", null);
                                            const demo = new Demo();
                                             
                                            Try

                                            emitDecoratorMetadataがtrueに設定されている場合、EmitされたJavaScriptは次のようになります。

                                            ts
                                            "use strict";
                                            var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
                                            var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
                                            if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
                                            else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
                                            return c > 3 && r && Object.defineProperty(target, key, r), r;
                                            };
                                            var __metadata = (this && this.__metadata) || function (k, v) {
                                            if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
                                            };
                                            function LogMethod(target, propertyKey, descriptor) {
                                            console.log(target);
                                            console.log(propertyKey);
                                            console.log(descriptor);
                                            }
                                            class Demo {
                                            foo(bar) {
                                            // do nothing
                                            }
                                            }
                                            __decorate([
                                            LogMethod,
                                            __metadata("design:type", Function),
                                            __metadata("design:paramtypes", [Number]),
                                            __metadata("design:returntype", void 0)
                                            ], Demo.prototype, "foo", null);
                                            const demo = new Demo();
                                             
                                            Try

                                            #実験的なデコレータ - experimentalDecorators

                                            デコレータの実験的なサポートを有効にします。これは、TC39標準化プロセスに先行するバージョンのデコレータです。

                                            デコレータは、まだJavaScript仕様に完全に承認されていない言語機能です。つまり、TypeScriptの実装バージョンは、TC39によって決定された場合、JavaScriptの実装とは異なる場合があります。

                                            TypeScriptでのデコレータのサポートの詳細については、ハンドブックを参照してください。

                                            #JSX - jsx

                                            JavaScriptファイルでJSX構造がどのようにEmitされるかを制御します。これは、.tsxファイルから開始されたJSファイルの出力のみに影響します。

                                            • react:JSXを同等のReact.createElement呼び出しに変更した.jsファイルをEmitします。
                                            • react-jsx:JSXを_jsx呼び出しに変更した.jsファイルをEmitします。
                                            • react-jsxdev:JSXを_jsx呼び出しに変更した.jsファイルをEmitします。
                                            • preserve:JSXをそのまま残した.jsxファイルをEmitします。
                                            • react-native:JSXをそのまま残した.jsファイルをEmitします。

                                            このサンプルコード

                                            tsx
                                            export const HelloWorld = () => <h1>Hello world</h1>;

                                            デフォルト:"react"

                                            tsx
                                            import React from 'react';
                                            export const HelloWorld = () => React.createElement("h1", null, "Hello world");
                                             
                                            Try

                                            保持:"preserve"

                                            tsx
                                            import React from 'react';
                                            export const HelloWorld = () => <h1>Hello world</h1>;
                                             
                                            Try

                                            React Native:"react-native"

                                            tsx
                                            import React from 'react';
                                            export const HelloWorld = () => <h1>Hello world</h1>;
                                             
                                            Try

                                            React 17変換:"react-jsx"[1]

                                            tsx
                                            import { jsx as _jsx } from "react/jsx-runtime";
                                            import React from 'react';
                                            export const HelloWorld = () => _jsx("h1", { children: "Hello world" });
                                             
                                            Try

                                            React 17開発変換:"react-jsxdev"[1]

                                            tsx
                                            import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
                                            const _jsxFileName = "/home/runner/work/TypeScript-Website/TypeScript-Website/index.tsx";
                                            import React from 'react';
                                            export const HelloWorld = () => _jsxDEV("h1", { children: "Hello world" }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 32 }, this);
                                             
                                            Try

                                            #JSXファクトリ - jsxFactory

                                            従来のJSXランタイムを使用してJSX要素をコンパイルする場合に、.jsファイルで呼び出される関数を変更します。preactを使用している場合、最も一般的な変更は、デフォルトの"React.createElement"の代わりに"h"または"preact.h"を使用することです。

                                            たとえば、このTSXファイル

                                            tsx
                                            import { h } from "preact";
                                            const HelloWorld = () => <div>Hello</div>;

                                            jsxFactory: "h"を使用すると、次のようになります。

                                            tsx
                                            const preact_1 = require("preact");
                                            const HelloWorld = () => (0, preact_1.h)("div", null, "Hello");
                                             
                                            Try

                                            このオプションは、Babelの/** @jsx h */ディレクティブと同様に、ファイルごとに使用することもできます。

                                            tsx
                                            /** @jsx h */
                                            import { h } from "preact";
                                             
                                            const HelloWorld = () => <div>Hello</div>;
                                            Try

                                            選択されたファクトリは、グローバルなものにフォールバックする前に、JSX名前空間がどこで検索されるか(型チェック情報の取得)にも影響します。

                                            ファクトリがReact.createElement(デフォルト)として定義されている場合、コンパイラはグローバルJSXをチェックする前にReact.JSXをチェックします。ファクトリがhとして定義されている場合、グローバルJSXをチェックする前にh.JSXをチェックします。

                                            #JSXフラグメントファクトリ - jsxFragmentFactory

                                            jsxFactoryコンパイラオプションが指定されている場合(例:Fragment)、ターゲットreact JSX Emitに使用するJSXフラグメントファクトリ関数を指定します。

                                            たとえば、このTSConfigを使用すると

                                            {
                                            "": "esnext",
                                            "": "commonjs",
                                            "": "react",
                                            "": "h",
                                            "": "Fragment"
                                            }
                                            }

                                            このTSXファイル

                                            tsx
                                            import { h, Fragment } from "preact";
                                            const HelloWorld = () => (
                                            <>
                                            <div>Hello</div>
                                            </>
                                            );

                                            次のようになります。

                                            tsx
                                            const preact_1 = require("preact");
                                            const HelloWorld = () => ((0, preact_1.h)(preact_1.Fragment, null,
                                            (0, preact_1.h)("div", null, "Hello")));
                                             
                                            Try

                                            このオプションは、Babelの/* @jsxFrag h */ディレクティブと同様に、ファイルごとに使用することもできます。

                                            たとえば

                                            tsx
                                            /** @jsx h */
                                            /** @jsxFrag Fragment */
                                             
                                            import { h, Fragment } from "preact";
                                             
                                            const HelloWorld = () => (
                                            <>
                                            <div>Hello</div>
                                            </>
                                            );
                                            Try

                                            #JSXインポートソース - jsxImportSource

                                            jsx"react-jsx"または"react-jsxdev"として使用する場合に、jsxおよびjsxsファクトリ関数のインポートに使用されるモジュール指定子を宣言します。これらはTypeScript 4.1で導入されました。

                                            React 17では、ライブラリは別のインポートを介して新しい形式のJSX変換をサポートしています。

                                            たとえば、このコードを使用すると

                                            tsx
                                            import React from "react";
                                            function App() {
                                            return <h1>Hello World</h1>;
                                            }

                                            このTSConfigを使用すると

                                            {
                                            "": "esnext",
                                            "": "commonjs",
                                            "": "react-jsx"
                                            }
                                            }

                                            TypeScriptからEmitされたJavaScriptは次のようになります。

                                            tsx
                                            "use strict";
                                            var __importDefault = (this && this.__importDefault) || function (mod) {
                                            return (mod && mod.__esModule) ? mod : { "default": mod };
                                            };
                                            Object.defineProperty(exports, "__esModule", { value: true });
                                            const jsx_runtime_1 = require("react/jsx-runtime");
                                            const react_1 = __importDefault(require("react"));
                                            function App() {
                                            return (0, jsx_runtime_1.jsx)("h1", { children: "Hello World" });
                                            }
                                             
                                            Try

                                            例えば、"jsxImportSource": "preact"を使用したい場合、次のようなtsconfigが必要です。

                                            {
                                            "": "esnext",
                                            "": "commonjs",
                                            "": "react-jsx",
                                            "": "preact",
                                            "": ["preact"]
                                            }
                                            }

                                            これは、次のようなコードを生成します。

                                            tsx
                                            function App() {
                                            return (0, jsx_runtime_1.jsx)("h1", { children: "Hello World" });
                                            }
                                            exports.App = App;
                                             
                                            Try

                                            あるいは、ファイルごとのプラグマを使用してこのオプションを設定することもできます。例えば、

                                            tsx
                                            /** @jsxImportSource preact */
                                            export function App() {
                                            return <h1>Hello World</h1>;
                                            }

                                            は、_jsxファクトリ用のインポートとしてpreact/jsx-runtimeを追加します。

                                            注記: これが期待通りに動作するためには、tsxファイルにexportまたはimportを含めて、モジュールとして認識されるようにする必要があります。

                                            # Lib - lib

                                            TypeScriptには、組み込みのJS API(Mathなど)の型定義のデフォルトセットと、ブラウザ環境(documentなど)にあるものの型定義が含まれています。TypeScriptには、指定したtargetと一致する新しいJS機能のAPIも含まれています。例えば、targetES6以降の場合、Mapの定義を使用できます。

                                            いくつかの理由でこれらを変更したい場合があります。

                                            • プログラムがブラウザで実行されないため、"dom"型定義は必要ありません。
                                            • ランタイムプラットフォームは特定のJavaScript APIオブジェクトを提供しますが(ポリフィルを介して)、特定のECMAScriptバージョンの完全な構文はまだサポートしていません。
                                            • 上位レベルのECMAScriptバージョンのいくつかにはポリフィルまたはネイティブ実装がありますが、すべてではありません。

                                            TypeScript 4.5では、libファイルはnpmモジュールによってオーバーライドできます。詳細はブログを参照してください。

                                            上位レベルライブラリ

                                            名前 内容
                                            ES5 すべてのES3およびES5機能のコア定義
                                            ES2015 ES2015(ES6とも呼ばれる)で使用可能な追加API - array.findPromiseProxySymbolMapSetReflectなど。
                                            ES6 「ES2015」のエイリアス
                                            ES2016 ES2016で使用可能な追加API - array.includeなど。
                                            ES7 「ES2016」のエイリアス
                                            ES2017 ES2017で使用可能な追加API - Object.entriesObject.valuesAtomicsSharedArrayBufferdate.formatToParts、型付き配列など。
                                            ES2018 ES2018で使用可能な追加API - asyncイテラブル、promise.finallyIntl.PluralRulesregexp.groupsなど。
                                            ES2019 ES2019で使用可能な追加API - array.flatarray.flatMapObject.fromEntriesstring.trimStartstring.trimEndなど。
                                            ES2020 ES2020で使用可能な追加API - string.matchAllなど。
                                            ES2021 ES2021で使用可能な追加API - promise.anystring.replaceAllなど。
                                            ES2022 ES2022で使用可能な追加API - array.atRegExp.hasIndicesなど。
                                            ESNext ESNextで使用可能な追加API - JavaScript仕様の進化に伴って変化します。
                                            DOM DOM定義 - windowdocumentなど。
                                            WebWorker WebWorkerコンテキストで使用可能なAPI
                                            ScriptHost Windows Script Hosting SystemのAPI

                                            個々のライブラリコンポーネント

                                            名前
                                            DOM.Iterable
                                            ES2015.Core
                                            ES2015.Collection
                                            ES2015.Generator
                                            ES2015.Iterable
                                            ES2015.Promise
                                            ES2015.Proxy
                                            ES2015.Reflect
                                            ES2015.Symbol
                                            ES2015.Symbol.WellKnown
                                            ES2016.Array.Include
                                            ES2017.object
                                            ES2017.Intl
                                            ES2017.SharedMemory
                                            ES2017.String
                                            ES2017.TypedArrays
                                            ES2018.Intl
                                            ES2018.Promise
                                            ES2018.RegExp
                                            ES2019.Array
                                            ES2019.Object
                                            ES2019.String
                                            ES2019.Symbol
                                            ES2020.String
                                            ES2020.Symbol.wellknown
                                            ES2021.Promise
                                            ES2021.String
                                            ES2021.WeakRef
                                            ESNext.AsyncIterable
                                            ESNext.Array
                                            ESNext.Intl
                                            ESNext.Symbol

                                            このリストは古くなっている可能性があります。TypeScriptソースコードで完全なリストを確認できます。

                                            # Module Detection - moduleDetection

                                            この設定は、TypeScriptがファイルをスクリプトまたはモジュールとしてどのように判断するかを制御します。

                                            3つの選択肢があります。

                                            • "auto"(デフォルト) - TypeScriptは、importおよびexportステートメントを探すだけでなく、modulenodenextまたはnode16で実行する場合、package.json"type"フィールドが"module"に設定されているかどうか、およびjsxreact-jsxで実行する場合、現在のファイルがJSXファイルかどうかを確認します。

                                            • "legacy" - 4.6以前と同じ動作で、importおよびexportステートメントを使用してファイルがモジュールかどうかを判断します。

                                            • "force" - すべての非宣言ファイルをモジュールとして扱います。

                                            • デフォルト

                                              "auto": import、export、import.meta、jsx(jsx: react-jsxの場合)、またはesm形式(module: node16+の場合)を含むファイルをモジュールとして扱います。

                                            • 許可されるもの
                                              • legacy

                                              • auto

                                              • force

                                            • リリース済み

                                              4.7

                                            # No Lib - noLib

                                            ライブラリファイルの自動インクルードを無効にします。このオプションが設定されている場合、libは無視されます。

                                            TypeScriptは、ArrayBooleanFunctionIArgumentsNumberObjectRegExpStringなどの主要なプリミティブのインターフェースセットなしでは、何もコンパイルできません。noLibを使用する場合は、これらの独自の型定義を含めることが期待されます。

                                            # React Namespace - reactNamespace

                                            jsxFactoryの代わりに使用してください。TSXファイルでreactをターゲットとする場合にcreateElementに対して呼び出されるオブジェクトを指定します。

                                            • デフォルト

                                              React

                                            # Target - target

                                            最新のブラウザはすべてのES6機能をサポートしているため、ES6は良い選択です。コードが古い環境に展開されている場合、またはコードが新しい環境で確実に実行される場合は、より低いターゲットを設定することを選択できます。

                                            target設定は、どのJS機能がダウングレードされ、どの機能がそのまま残されるかを変更します。例えば、アロー関数() => thisは、targetがES5以下の場合、同等のfunction式に変換されます。

                                            targetを変更すると、libのデフォルト値も変更されます。必要に応じてtargetlibの設定を自由に組み合わせることができますが、便宜上targetを設定することもできます。

                                            Nodeなどの開発者プラットフォームでは、プラットフォームの種類とそのバージョンに応じて、targetのベースラインがあります。一般的なプラットフォームとそのバージョンに対する設定は、tsconfig/basesにあるコミュニティによって整理されたTSConfigsのセットで見つけることができます。

                                            特別なESNext値は、使用しているTypeScriptバージョンがサポートする最高バージョンを参照します。この設定は、異なるTypeScriptバージョン間で同じ意味を持たないため、アップグレードの予測可能性を低下させる可能性があるため、注意して使用する必要があります。

                                            • デフォルト

                                              ES3

                                            • 許可されるもの
                                              • es3

                                              • es5

                                              • es6/es2015

                                              • es2016

                                              • es2017

                                              • es2018

                                              • es2019

                                              • es2020

                                              • es2021

                                              • es2022

                                              • esnext

                                            • リリース済み

                                              1.0

                                            # Use Define For Class Fields - useDefineForClassFields

                                            このフラグは、クラスフィールドの今後の標準バージョンへの移行の一部として使用されます。TypeScriptは、TC39で承認されるずっと前にクラスフィールドを導入しました。今後の仕様の最新バージョンは、TypeScriptの実装とは異なるランタイム動作を持ちますが、構文は同じです。

                                            このフラグは、今後のECMAランタイム動作に切り替えます。

                                            3.7リリースノートで移行の詳細を読むことができます。

                                            • デフォルト

                                              targetES2022以上(ESNextを含む)の場合true、それ以外の場合はfalse

                                            • リリース済み

                                              3.7

                                            #コンパイラ診断

                                            # Diagnostics - diagnostics

                                            デバッグのための診断情報の出力に使用されます。このコマンドは、よりユーザーフレンドリーな結果であり、解釈しやすいextendedDiagnosticsのサブセットです。

                                            TypeScriptコンパイラエンジニアから、このフラグを使用してコンパイルの結果を提供するように求められた場合、代わりにextendedDiagnosticsを使用しても問題ありません。

                                            # Explain Files - explainFiles

                                            TypeScriptがプロジェクトの一部として認識するファイルの名前と、それらがコンパイルの一部である理由を出力します。

                                            例えば、単一のindex.tsファイルだけのこのプロジェクトでは

                                            sh
                                            example
                                            ├── index.ts
                                            ├── package.json
                                            └── tsconfig.json

                                            explainFilesをtrueに設定したtsconfig.jsonを使用すると

                                            json
                                            {
                                            "compilerOptions": {
                                            "target": "es5",
                                            "module": "commonjs",
                                            "explainFiles": true
                                            }
                                            }

                                            このフォルダに対してTypeScriptを実行すると、次のような出力が得られます。

                                            ❯ tsc node_modules/typescript/lib/lib.d.ts Default library for target 'es5' node_modules/typescript/lib/lib.es5.d.ts Library referenced via 'es5' from file 'node_modules/typescript/lib/lib.d.ts' node_modules/typescript/lib/lib.dom.d.ts Library referenced via 'dom' from file 'node_modules/typescript/lib/lib.d.ts' node_modules/typescript/lib/lib.webworker.importscripts.d.ts Library referenced via 'webworker.importscripts' from file 'node_modules/typescript/lib/lib.d.ts' node_modules/typescript/lib/lib.scripthost.d.ts Library referenced via 'scripthost' from file 'node_modules/typescript/lib/lib.d.ts' index.ts Matched by include pattern '**/*' in 'tsconfig.json'

                                            上記の出力は次のことを示しています。

                                            • targetに基づいた最初のlib.d.tsの検索と、参照される.d.tsファイルのチェーン。
                                            • includeのデフォルトパターンによって位置が特定されたindex.tsファイル。

                                            このオプションは、ファイルがコンパイルの一部になった方法をデバッグするために意図されています。

                                            • リリース済み

                                              4.2

                                            # Extended Diagnostics - extendedDiagnostics

                                            このフラグを使用して、TypeScriptがコンパイル時に時間をどこに費やしているかを調べることができます。これは、コードベース全体の性能特性を理解するために使用されるツールです。

                                            出力の測定方法と理解方法の詳細については、パフォーマンスに関するWiki のセクションを参照してください。

                                            # CPUプロファイルの生成 - generateCpuProfile

                                            このオプションを使用すると、コンパイラの動作中にTypeScriptがv8 CPUプロファイルを生成できます。CPUプロファイルは、ビルドが遅い原因を特定するのに役立ちます。

                                            このオプションは、CLIからのみ使用できます: --generateCpuProfile tsc-output.cpuprofile

                                            sh
                                            npm run tsc --generateCpuProfile tsc-output.cpuprofile

                                            このファイルは、ChromeやEdge DeveloperなどのChromiumベースのブラウザでCPUプロファイラセクションで開くことができます。コンパイラの性能に関する詳細については、TypeScript Wikiのパフォーマンスに関するセクションを参照してください。

                                            • デフォルト

                                              profile.cpuprofile

                                            • リリース済み

                                              3.7

                                            # 生成されたファイルのリスト - listEmittedFiles

                                            コンパイルの一部として生成されたファイル名をターミナルに出力します。

                                            このフラグは、次の2つの場合に役立ちます。

                                            • ファイル名が次のコマンドで処理されるターミナルで、ビルドチェーンの一部としてTypeScriptをトランスパイルする場合。
                                            • ファイルのインクルード設定のデバッグの一環として、TypeScriptが想定したファイルを含んでいるかどうかわからない場合。

                                            たとえば

                                            example ├── index.ts ├── package.json └── tsconfig.json

                                            使用すると

                                            {
                                            "": true,
                                            "": true
                                            }
                                            }

                                            次のようなパスが出力されます。

                                            $ npm run tsc path/to/example/index.js path/to/example/index.d.ts

                                            通常、TypeScriptは成功した場合に何も返しません。

                                              # ファイルのリスト - listFiles

                                              コンパイルの一部であるファイル名を出力します。これは、TypeScriptが想定したファイルを含んでいるかどうかわからない場合に役立ちます。

                                              たとえば

                                              example ├── index.ts ├── package.json └── tsconfig.json

                                              使用すると

                                              {
                                              "": true
                                              }
                                              }

                                              次のようなパスが出力されます。

                                              $ npm run tsc path/to/example/node_modules/typescript/lib/lib.d.ts path/to/example/node_modules/typescript/lib/lib.es5.d.ts path/to/example/node_modules/typescript/lib/lib.dom.d.ts path/to/example/node_modules/typescript/lib/lib.webworker.importscripts.d.ts path/to/example/node_modules/typescript/lib/lib.scripthost.d.ts path/to/example/index.ts

                                              TypeScript 4.2を使用する場合は、ファイルが追加された理由の説明も提供するexplainFilesを使用することをお勧めします。

                                              # リゾリューションのトレース - traceResolution

                                              モジュールがインクルードされない理由をデバッグしようとしている場合、traceResolutiontrueに設定すると、処理された各ファイルの解決プロセスに関する情報がTypeScriptによって出力されます。

                                              • リリース済み

                                                2.0

                                              #プロジェクト

                                              # コンポジット - composite

                                              compositeオプションは、ビルドツール(--buildモードのTypeScript自身を含む)がプロジェクトが既にビルドされているかどうかを迅速に判断できるようにする特定の制約を適用します。

                                              この設定が有効な場合

                                              • rootDir設定は、明示的に設定されていない場合、tsconfig.jsonファイルを含むディレクトリにデフォルトで設定されます。

                                              • すべてのインプリメンテーションファイルは、includeパターンに一致するか、files配列にリストされている必要があります。この制約に違反すると、tscは指定されていないファイルを通知します。

                                              • declarationtrueにデフォルト設定されています。

                                              TypeScriptプロジェクトに関するドキュメントは、ハンドブックにあります。

                                              # 参照プロジェクトの読み込みの無効化 - disableReferencedProjectLoad

                                              複数プロジェクトのTypeScriptプログラムでは、TypeScriptはすべての利用可能なプロジェクトをメモリに読み込み、「すべての参照を検索」など、完全なナレッジグラフを必要とするエディタの応答に対して正確な結果を提供します。

                                              プロジェクトが大きい場合は、disableReferencedProjectLoadフラグを使用して、すべてのプロジェクトの自動読み込みを無効にすることができます。代わりに、エディタでファイルを開く際に、プロジェクトは動的に読み込まれます。

                                              • リリース済み

                                                4.0

                                              # ソリューション検索の無効化 - disableSolutionSearching

                                              コンポジットTypeScriptプロジェクトを使用する場合、このオプションを使用すると、エディタで「すべての参照を検索」や「定義へジャンプ」などの機能を使用する際に、プロジェクトを含めないように宣言できます。

                                              このフラグは、大規模なコンポジットプロジェクトの応答性を向上させるために使用できます。

                                              • リリース済み

                                                3.8

                                              # ソースプロジェクト参照のリダイレクトの無効化 - disableSourceOfProjectReferenceRedirect

                                              コンポジットTypeScriptプロジェクトを使用する場合、このオプションを使用すると、3.7より前の動作に戻すことができ、d.tsファイルがモジュール間の境界として使用されます。3.7以降、真実のソースはTypeScriptファイルになりました。

                                              • リリース済み

                                                3.7

                                              # インクリメンタル - incremental

                                              TypeScriptに、前回のコンパイルからのプロジェクトグラフに関する情報をディスクに保存されたファイルに保存するように指示します。これにより、コンパイル出力と同じフォルダに一連の.tsbuildinfoファイルが作成されます。これらは実行時にJavaScriptによって使用されることはなく、安全に削除できます。このフラグの詳細については、3.4リリースノートを参照してください。

                                              ファイルをビルドするフォルダを制御するには、設定オプションtsBuildInfoFileを使用します。

                                              # TSビルド情報ファイル - tsBuildInfoFile

                                              この設定を使用すると、インクリメンタルコンパイル情報を格納するためのファイル(大規模なTypeScriptコードベースのビルドを高速化するためにコンポジットプロジェクトの一部として使用)を指定できます。コンポジットプロジェクトの詳細については、ハンドブックを参照してください。

                                              デフォルトは、他の設定の組み合わせによって異なります。

                                              • outFileが設定されている場合、デフォルトは<outFile>.tsbuildinfoです。
                                              • rootDiroutDirが設定されている場合、ファイルは<outDir>/<rootDirからのconfigへの相対パス>/<config名>.tsbuildinfoになります。たとえば、rootDirsrcで、outDirdestで、configが./tsconfig.jsonの場合、src/から./tsconfig.jsonへの相対パスは../であるため、デフォルトは./tsconfig.tsbuildinfoになります。
                                              • outDirが設定されている場合、デフォルトは<outDir>/<config名>.tsbuildInfoです。
                                              • それ以外の場合は、デフォルトは<config名>.tsbuildInfoです。

                                              #出力フォーマット

                                              # エラーメッセージの切り詰めなし - noErrorTruncation

                                              エラーメッセージを切り詰めません。

                                              false(デフォルト)の場合。

                                              ts
                                              var x: {
                                              propertyWithAnExceedinglyLongName1: string;
                                              propertyWithAnExceedinglyLongName2: string;
                                              propertyWithAnExceedinglyLongName3: string;
                                              propertyWithAnExceedinglyLongName4: string;
                                              propertyWithAnExceedinglyLongName5: string;
                                              propertyWithAnExceedinglyLongName6: string;
                                              propertyWithAnExceedinglyLongName7: string;
                                              propertyWithAnExceedinglyLongName8: string;
                                              };
                                               
                                              // String representation of type of 'x' should be truncated in error message
                                              var s: string = x;
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propert...' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              2322
                                              2454
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propert...' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              Try

                                              trueの場合。

                                              ts
                                              var x: {
                                              propertyWithAnExceedinglyLongName1: string;
                                              propertyWithAnExceedinglyLongName2: string;
                                              propertyWithAnExceedinglyLongName3: string;
                                              propertyWithAnExceedinglyLongName4: string;
                                              propertyWithAnExceedinglyLongName5: string;
                                              propertyWithAnExceedinglyLongName6: string;
                                              propertyWithAnExceedinglyLongName7: string;
                                              propertyWithAnExceedinglyLongName8: string;
                                              };
                                               
                                              // String representation of type of 'x' should be truncated in error message
                                              var s: string = x;
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propertyWithAnExceedinglyLongName8: string; }' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              2322
                                              2454
                                              Type '{ propertyWithAnExceedinglyLongName1: string; propertyWithAnExceedinglyLongName2: string; propertyWithAnExceedinglyLongName3: string; propertyWithAnExceedinglyLongName4: string; propertyWithAnExceedinglyLongName5: string; propertyWithAnExceedinglyLongName6: string; propertyWithAnExceedinglyLongName7: string; propertyWithAnExceedinglyLongName8: string; }' is not assignable to type 'string'.
                                              Variable 'x' is used before being assigned.
                                              Try

                                                # ウォッチ出力の保持 - preserveWatchOutput

                                                変更が発生するたびに画面をクリアする代わりに、ウォッチモードで古いコンソール出力を保持するかどうか。

                                                • 内部

                                                # 整形 - pretty

                                                色とコンテキストを使用してエラーとメッセージのスタイルを設定します。これはデフォルトで有効になっており、コンパイラからの簡潔で単色のメッセージを減らすことができます。

                                                • デフォルト

                                                  true

                                                #完全性

                                                # デフォルトライブラリのチェックスキップ - skipDefaultLibCheck

                                                skipLibCheckの代わりに使用します。デフォルトライブラリの宣言ファイルの型チェックをスキップします。

                                                  # ライブラリチェックのスキップ - skipLibCheck

                                                  宣言ファイルの型チェックをスキップします。

                                                  これにより、型システムの正確性を犠牲にしてコンパイル時間を短縮できます。たとえば、2つのライブラリが同じtypeの2つのコピーを矛盾した方法で定義する場合があります。すべてのd.tsファイルの完全なチェックを行うのではなく、TypeScriptはアプリのソースコードで具体的に参照するコードの型チェックを行います。

                                                  skipLibCheckを使用することを検討する一般的なケースは、node_modulesにライブラリの型の2つのコピーが存在する場合です。このような場合は、yarnの解決策などの機能を使用して、ツリーにその依存関係のコピーが1つだけ存在するようにするか、依存関係の解決を理解して追加のツールを使用せずに問題を解決する方法を調査してください。

                                                  もう1つの可能性は、TypeScriptのリリース間で移行していて、変更によってnode_modulesとJS標準ライブラリで問題が発生し、TypeScriptの更新中にそれに対処したくない場合です。

                                                  これらの問題がTypeScript標準ライブラリから発生する場合は、TypeScript 4.5のlib置換テクニックを使用してライブラリを置き換えることができます。

                                                  • 推奨
                                                  • リリース済み

                                                    2.0

                                                  #コマンドライン

                                                  #ウォッチオプション

                                                  TypeScript 3.8では、ディレクトリの監視に関する新しい戦略が導入されました。これは、node_modulesへの変更を効率的に検出するために非常に重要です。

                                                  Linuxなどのオペレーティングシステムでは、TypeScriptは依存関係の変更を検出するために、node_modulesとその多くのサブディレクトリにディレクトリウォッチャー(ファイルウォッチャーではなく)をインストールします。これは、利用可能なファイルウォッチャーの数がnode_modules内のファイルの数を超えることが多いためですが、追跡する必要があるディレクトリの数ははるかに少ないためです。

                                                  プロジェクトによって最適な戦略は異なるため、この新しいアプローチがワークフローに適していない場合もあります。TypeScript 3.8では、新しいwatchOptionsフィールドが導入され、コンパイラ/言語サービスに対して、ファイルとディレクトリの追跡に使用する監視戦略を指定できるようになりました。

                                                  # 変更は直接依存関係のみに影響する - assumeChangesOnlyAffectDirectDependencies

                                                  このオプションを有効にすると、TypeScriptは実際に影響を受ける可能性のあるすべてのファイルを再チェック/再ビルドするのを避け、変更されたファイルとそのファイルを直接インポートするファイルのみを再チェック/再ビルドします。

                                                  これは、監視アルゴリズムの「高速かつ緩い」実装と見なすことができ、増分ビルド時間を大幅に短縮できますが、すべてのコンパイラエラーメッセージを取得するために、時々フルビルドを実行する必要があるという代償を払います。

                                                  • リリース済み

                                                    3.8

                                                  監視オプション

                                                  TypeScriptの--watchの動作方法を構成できます。このセクションは主に、Linuxなどにおいてfs.watchfs.watchFileに追加の制約がある場合の処理を目的としています。監視の構成で詳細を確認できます。

                                                  # ファイル監視 - watchFile

                                                  個々のファイルの監視方法に関する戦略です。

                                                  • fixedPollingInterval: 固定間隔で1秒間に数回、すべてのファイルの変更をチェックします。
                                                  • priorityPollingInterval: 1秒間に数回、すべてのファイルの変更をチェックしますが、ヒューリスティックを使用して、特定の種類のファイルを他のファイルよりも低頻度でチェックします。
                                                  • dynamicPriorityPolling: 低頻度に修正されるファイルは低頻度でチェックされる動的キューを使用します。
                                                  • useFsEvents (デフォルト): ファイルの変更に対してオペレーティングシステム/ファイルシステムのネイティブイベントを使用しようとします。
                                                  • useFsEventsOnParentDirectory: ファイルの親ディレクトリの変更を監視するために、オペレーティングシステム/ファイルシステムのネイティブイベントを使用しようとします。
                                                  • 許可されるもの
                                                    • fixedpollinginterval

                                                    • prioritypollinginterval

                                                    • dynamicprioritypolling

                                                    • fixedchunksizepolling

                                                    • usefsevents

                                                    • usefseventsonparentdirectory

                                                  • リリース済み

                                                    3.8

                                                  # ディレクトリ監視 - watchDirectory

                                                  再帰的なファイル監視機能がないシステムで、ディレクトリツリー全体を監視する方法に関する戦略です。

                                                  • fixedPollingInterval: 固定間隔で1秒間に数回、すべてのディレクトリの変更をチェックします。
                                                  • dynamicPriorityPolling: 低頻度に修正されるディレクトリは低頻度でチェックされる動的キューを使用します。
                                                  • useFsEvents (デフォルト): ディレクトリの変更に対してオペレーティングシステム/ファイルシステムのネイティブイベントを使用しようとします。
                                                  • 許可されるもの
                                                    • usefsevents

                                                    • fixedpollinginterval

                                                    • dynamicprioritypolling

                                                    • fixedchunksizepolling

                                                  • リリース済み

                                                    3.8

                                                  # フォールバックポーリング - fallbackPolling

                                                  ファイルシステムイベントを使用する場合、このオプションは、システムがネイティブファイルウォッチャーを使い果たした場合、またはネイティブファイルウォッチャーをサポートしていない場合に使用されるポーリング戦略を指定します。

                                                  • fixedPollingInterval: 固定間隔で1秒間に数回、すべてのファイルの変更をチェックします。
                                                  • priorityPollingInterval: 1秒間に数回、すべてのファイルの変更をチェックしますが、ヒューリスティックを使用して、特定の種類のファイルを他のファイルよりも低頻度でチェックします。
                                                  • dynamicPriorityPolling: 低頻度に修正されるファイルは低頻度でチェックされる動的キューを使用します。
                                                  • synchronousWatchDirectory: ディレクトリの遅延監視を無効にします。遅延監視は、一度に多くのファイルの変更が発生する可能性がある場合(例:npm installの実行によるnode_modulesの変更)に役立ちますが、一部のあまり一般的ではない設定では、このフラグを使用して無効にすることができます。
                                                  • 許可されるもの
                                                    • fixedinterval

                                                    • priorityinterval

                                                    • dynamicpriority

                                                    • fixedchunksize

                                                  • リリース済み

                                                    3.8

                                                  # 同期ディレクトリ監視 - synchronousWatchDirectory

                                                  再帰的な監視をネイティブでサポートしていないプラットフォームで、コールバックを同期的に呼び出し、ディレクトリウォッチャーの状態を更新します。ファイルで複数の編集が発生する可能性がある場合に小さなタイムアウトを与える代わりに。

                                                  {
                                                  "watchOptions": {
                                                  }
                                                  }

                                                    # ディレクトリの除外 - excludeDirectories

                                                    excludeFilesを使用して、--watch中に監視されるファイルの数を大幅に減らすことができます。これは、LinuxでTypeScriptが追跡する開いているファイルの数を減らすための有効な方法です。

                                                    {
                                                    "watchOptions": {
                                                    "": ["**/node_modules", "_build", "temp/*"]
                                                    }
                                                    }

                                                      # ファイルの除外 - excludeFiles

                                                      excludeFilesを使用して、監視されるファイルから特定のファイルのセットを除外できます。

                                                      {
                                                      "watchOptions": {
                                                      "": ["temp/file.ts"]
                                                      }
                                                      }

                                                        型取得

                                                        型取得はJavaScriptプロジェクトでのみ重要です。TypeScriptプロジェクトでは、プロジェクトに型を明示的に含める必要があります。ただし、JavaScriptプロジェクトでは、TypeScriptツールはバックグラウンドで、node_modulesフォルダーの外側にあるモジュールの型をダウンロードします。

                                                        # 有効化 - enable

                                                        JavaScriptプロジェクトでの自動型取得を無効にします。

                                                        json
                                                        {
                                                        "typeAcquisition": {
                                                        "enable": false
                                                        }
                                                        }

                                                          # 組み込み - include

                                                          TypeScriptがグローバル依存関係を理解するための追加のガイダンスが必要なJavaScriptプロジェクトがある場合、またはdisableFilenameBasedTypeAcquisitionを使用して組み込みの推論を無効にした場合。

                                                          includeを使用して、DefinitelyTypedから使用する型を指定できます。

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "include": ["jquery"]
                                                          }
                                                          }

                                                          # 除外 - exclude

                                                          JavaScriptプロジェクトで特定のモジュールの型取得を無効にするための設定を提供します。これは、メインアプリケーションでは必要ないテストインフラストラクチャに他のライブラリが含まれているプロジェクトに役立ちます。

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "exclude": ["jest", "mocha"]
                                                          }
                                                          }

                                                          # ファイル名に基づく型取得の無効化 - disableFilenameBasedTypeAcquisition

                                                          TypeScriptの型取得は、プロジェクト内のファイル名に基づいて、追加する型を推論できます。つまり、プロジェクトにjquery.jsのようなファイルがあると、DefinitelyTypedからJQueryの型が自動的にダウンロードされます。

                                                          disableFilenameBasedTypeAcquisitionを使用してこれを無効にできます。

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "disableFilenameBasedTypeAcquisition": true
                                                          }
                                                          }
                                                          • リリース済み

                                                            4.1