Compiler Options

"compilerOptions"

JavaScript Support
  1. allowJs,
  2. checkJs and
  3. maxNodeModuleJsDepth
Editor Support
  1. disableSizeLimit and
  2. plugins
Command Line

    Root Fields

    Starting up are the root options in the TSConfig - these options relate to how your TypeScript or JavaScript project is set up.

    # Files - files

    Specifies an allowlist of files to include in the program. An error occurs if any of the files can’t be found.

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

    This is useful when you only have a small number of files and don’t need to use a glob to reference many files. If you need that then use include.

    # Extends - extends

    The value of extends is a string which contains a path to another configuration file to inherit from. The path may use Node.js style resolution.

    The configuration from the base file are loaded first, then overridden by those in the inheriting config file. All relative paths found in the configuration file will be resolved relative to the configuration file they originated in.

    It’s worth noting that files, include, and exclude from the inheriting config file overwrite those from the base config file, and that circularity between configuration files is not allowed.

    Currently, the only top-level property that is excluded from inheritance is references.

    Example

    configs/base.json:

    tsconfig.json:

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

    tsconfig.nostrictnull.json:

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

    Properties with relative paths found in the configuration file, which aren’t excluded from inheritance, will be resolved relative to the configuration file they originated in.

    • Default:

      false

    • Released:

      2.1

    # Include - include

    Specifies an array of filenames or patterns to include in the program. These filenames are resolved relative to the directory containing the tsconfig.json file.

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

    Which would include:

    .
    ├── 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

    include and exclude support wildcard characters to make glob patterns:

    • * matches zero or more characters (excluding directory separators)
    • ? matches any one character (excluding directory separators)
    • **/ matches any directory nested to any level

    If the last path segment in a pattern does not contain a file extension or wildcard character, then it is treated as a directory, and files with supported extensions inside that directory are included (e.g. .ts, .tsx, and .d.ts by default, with .js and .jsx if allowJs is set to true).

    # Exclude - exclude

    Specifies an array of filenames or patterns that should be skipped when resolving include.

    Important: exclude only changes which files are included as a result of the include setting. A file specified by exclude can still become part of your codebase due to an import statement in your code, a types inclusion, a /// <reference directive, or being specified in the files list.

    It is not a mechanism that prevents a file from being included in the codebase - it simply changes what the include setting finds.

    # References - references

    Project references are a way to structure your TypeScript programs into smaller pieces. Using Project References can greatly improve build and editor interaction times, enforce logical separation between components, and organize your code in new and improved ways.

    You can read more about how references works in the Project References section of the handbook

    • Default:

      false

    Opzioni del Compilatore

    Queste opzioni espicitano la configurazione di TypeScript e spiegano come il linguaggio dovrebbe funzionare.

    #Type Checking

    # Permetti Codice Irraggiungibile - allowUnreachableCode

    Quando:

    • undefined (predefinito) fornire suggerimenti come avviso agli editor
    • true il codice irraggiungibile viene ignorato
    • false visualizza un errore di compilazione quando viene trovato del codice irraggiungibile

    Questi avvertimenti sono solo per codice che probabilmente è irraggiungibile a causa del uso di sintassi JavaScript, per esempio:

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

    Con "allowUnreachableCode": false:

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

    Ciò non influisce sugli errori sulla base del codice che sembra di essere irraggiungibile a causa dell analisi del tipo.

    # Permetti Label Non Utilizzati - allowUnusedLabels

    Imposta a False per disattivare le avvertenze riguardo label non utilizzati.

    In JavaScript i label sono molto rari e tipicamente indicano un tentativo di scrivere un oggetto letterale:

    ts
    function verificaEta(eta: number) {
    // Il 'return' non è presente
    if (eta > 18) {
    verificato: true;
    Unused label.7028Unused label.
    }
    }
    Try

    # Sempre Rigoroso - alwaysStrict

    Assicura che i tuoi file sono analizzati con la modalità ECMAScript rigoroso, ed emette use strict per ogni file sorgente.

    La modalità ECMAScript rigoroso è stata introdotta in ES5 e fornisce modifiche al comportamento runtime del JavaScript engine per migliorare le prestazioni e generare una serie di errori invece di ignorarli silenziosamente.

    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      2.1

    # Exact Optional Property Types - exactOptionalPropertyTypes

    With exactOptionalPropertyTypes enabled, TypeScript applies stricter rules around how it handles properties on type or interfaces which have a ? prefix.

    For example, this interface declares that there is a property which can be one of two strings: ‘dark’ or ‘light’ or it should not be in the object.

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

    Without this flag enabled, there are three values which you can set colorThemeOverride to be: “dark”, “light” and undefined.

    Setting the value to undefined will allow most JavaScript runtime checks for the existence to fail, which is effectively falsy. However, this isn’t quite accurate; colorThemeOverride: undefined is not the same as colorThemeOverride not being defined. For example, "colorThemeOverride" in settings would have different behavior with undefined as the key compared to not being defined.

    exactOptionalPropertyTypes makes TypeScript truly enforce the definition provided as an optional property:

    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
    • Recommended
    • Released:

      4.4

    # No Fallthrough Cases In Switch - noFallthroughCasesInSwitch

    Report errors for fallthrough cases in switch statements. Ensures that any non-empty case inside a switch statement includes either break, return, or throw. This means you won’t accidentally ship a case fallthrough bug.

    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

    # No Implicit Any - noImplicitAny

    In some cases where no type annotations are present, TypeScript will fall back to a type of any for a variable when it cannot infer the type.

    This can cause some errors to be missed, for example:

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

    Turning on noImplicitAny however TypeScript will issue an error whenever it would have inferred 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
    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:

    # No Implicit Override - noImplicitOverride

    When working with classes which use inheritance, it’s possible for a sub-class to get “out of sync” with the functions it overloads when they are renamed in the base class.

    For example, imagine you are modeling a music album syncing system:

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

    Then when you add support for machine-learning generated playlists, you refactor the Album class to have a ‘setup’ function instead:

    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

    In this case, TypeScript has provided no warning that download on SharedAlbum expected to override a function in the base class.

    Using noImplicitOverride you can ensure that the sub-classes never go out of sync, by ensuring that functions which override include the keyword override.

    The following example has noImplicitOverride enabled, and you can see the error received when override is missing:

    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

    # No Implicit Returns - noImplicitReturns

    When enabled, TypeScript will check all code paths in a function to ensure they return a value.

    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

    # No Implicit This - noImplicitThis

    Raise error on ‘this’ expressions with an implied ‘any’ type.

    For example, the class below returns a function which tries to access this.width and this.height – but the context for this inside the function inside getAreaFunction is not the instance of the 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
    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      2.0

    # No Property Access From Index Signature - noPropertyAccessFromIndexSignature

    This setting ensures consistency between accessing a field via the “dot” (obj.key) syntax, and “indexed” (obj["key"]) and the way which the property is declared in the type.

    Without this flag, TypeScript will allow you to use the dot syntax to access fields which are not defined:

    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

    Turning the flag on will raise an error because the unknown field uses dot syntax instead of indexed syntax.

    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

    The goal of this flag is to signal intent in your calling syntax about how certain you are this property exists.

    # No Unchecked Indexed Access - noUncheckedIndexedAccess

    TypeScript has a way to describe objects which have unknown keys but known values on an object, via index signatures.

    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

    Turning on noUncheckedIndexedAccess will add undefined to any un-declared field in the type.

    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

    # No Unused Locals - noUnusedLocals

    Report errors on unused local variables.

    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

    # No Unused Parameters - noUnusedParameters

    Report errors on unused parameters in functions.

    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

    # Strict - strict

    The strict flag enables a wide range of type checking behavior that results in stronger guarantees of program correctness. Turning this on is equivalent to enabling all of the strict mode family options, which are outlined below. You can then turn off individual strict mode family checks as needed.

    Future versions of TypeScript may introduce additional stricter checking under this flag, so upgrades of TypeScript might result in new type errors in your program. When appropriate and possible, a corresponding flag will be added to disable that behavior.

    # Strict Bind Call Apply - strictBindCallApply

    When set, TypeScript will check that the built-in methods of functions call, bind, and apply are invoked with correct argument for the underlying function:

    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

    Otherwise, these functions accept any arguments and will return 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
    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      3.2

    # Strict Function Types - strictFunctionTypes

    When enabled, this flag causes functions parameters to be checked more correctly.

    Here’s a basic example with strictFunctionTypes off:

    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

    With strictFunctionTypes on, the error is correctly detected:

    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

    During development of this feature, we discovered a large number of inherently unsafe class hierarchies, including some in the DOM. Because of this, the setting only applies to functions written in function syntax, not to those in method syntax:

    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
    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      2.6

    # Strict Null Checks - strictNullChecks

    When strictNullChecks is false, null and undefined are effectively ignored by the language. This can lead to unexpected errors at runtime.

    When strictNullChecks is true, null and undefined have their own distinct types and you’ll get a type error if you try to use them where a concrete value is expected.

    For example with this TypeScript code, users.find has no guarantee that it will actually find a user, but you can write code as though it will:

    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

    Setting strictNullChecks to true will raise an error that you have not made a guarantee that the loggedInUser exists before trying to use it.

    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

    The second example failed because the array’s find function looks a bit like this simplification:

    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;
    };
    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      2.0

    # Strict Property Initialization - strictPropertyInitialization

    When set to true, TypeScript will raise an error when a class property was declared but not set in the constructor.

    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

    In the above case:

    • this.name is set specifically.
    • this.accountType is set by default.
    • this.email is not set and raises an error.
    • this.address is declared as potentially undefined which means it does not have to be set.
    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      2.7

    # Use Unknown In Catch Variables - useUnknownInCatchVariables

    In TypeScript 4.0, support was added to allow changing the type of the variable in a catch clause from any to unknown. Allowing for code like:

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

    This pattern ensures that error handling code becomes more comprehensive because you cannot guarantee that the object being thrown is a Error subclass ahead of time. With the flag useUnknownInCatchVariables enabled, then you do not need the additional syntax (: unknown) nor a linter rule to try enforce this behavior.

    • Recommended
    • Default:

      true if strict; false otherwise.

    • Related:
    • Released:

      4.4

    #Modules

    # Allow Arbitrary Extensions - allowArbitraryExtensions

    In TypeScript 5.0, when an import path ends in an extension that isn’t a known JavaScript or TypeScript file extension, the compiler will look for a declaration file for that path in the form of {file basename}.d.{extension}.ts. For example, if you are using a CSS loader in a bundler project, you might want to write (or generate) declaration files for those stylesheets:

    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

    By default, this import will raise an error to let you know that TypeScript doesn’t understand this file type and your runtime might not support importing it. But if you’ve configured your runtime or bundler to handle it, you can suppress the error with the new --allowArbitraryExtensions compiler option.

    Note that historically, a similar effect has often been achievable by adding a declaration file named app.css.d.ts instead of app.d.css.ts - however, this just worked through Node’s require resolution rules for CommonJS. Strictly speaking, the former is interpreted as a declaration file for a JavaScript file named app.css.js. Because relative files imports need to include extensions in Node’s ESM support, TypeScript would error on our example in an ESM file under --moduleResolution node16 or nodenext.

    For more information, read up the proposal for this feature and its corresponding pull request.

      # Allow Importing TS Extensions - allowImportingTsExtensions

      --allowImportingTsExtensions allows TypeScript files to import each other with a TypeScript-specific extension like .ts, .mts, or .tsx.

      This flag is only allowed when --noEmit or --emitDeclarationOnly is enabled, since these import paths would not be resolvable at runtime in JavaScript output files. The expectation here is that your resolver (e.g. your bundler, a runtime, or some other tool) is going to make these imports between .ts files work.

        # Permetti Accesso Globale UMD - allowUmdGlobalAccess

        Quando viene impostato a true, il flag allowUmdGlobalAccess ti permette ad accedere ai export UMD come globali dentro l’archivio dei moduli. Un file modulo è un file che ha dei imports e/o exports. Senza questo flag per usare un export di un modulo UMD è necessario dichiarare un import.

        Un esempio di utilizzo di questo flag è un progetto web dove si conoscono le librerie particolari (come jQuery o Lodash) che saranno sempre disponibili al runtime, ma non puoi accedervi con un’import.

        # URL Di Base - baseUrl

        Ti permette di definire una directory di base per risolvere i nomi dei moduli non assoluti.

        Puoi definire una cartella root dove puoi fare una risoluzione dei file assoluta. Per esempio.

        URLBase
        ├── ex.ts
        ├── ciao
        │ └── mondo.ts
        └── tsconfig.json

        Con "baseUrl": "./" dentro il progetto, TypeScript andrà a procurare i file iniziando dalla stessa cartella in cui si trova tsconfig.json.

        ts
        import { ciaoMondo } from "ciao/mondo";
        console.log(ciaoMondo);

        Se sei stanco di vedere sempre i import come "../" o "./". O che devi sempre cambiargli quando sposti i file, questo è un ottimo modo per risolvere questo problema.

          # Custom Conditions - customConditions

          --customConditions takes a list of additional conditions that should succeed when TypeScript resolves from an exports or imports field of a package.json. These conditions are added to whatever existing conditions a resolver will use by default.

          For example, when this field is set in a tsconfig.json as so:

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

          Any time an exports or imports field is referenced in package.json, TypeScript will consider conditions called my-condition.

          So when importing from a package with the following package.json

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

          TypeScript will try to look for files corresponding to foo.mjs.

          This field is only valid under the node16, nodenext, and bundler options for --moduleResolution.

          # Modulo - module

          Definisce il sistema di moduli per il programma. Consulta la sezione Moduli per più informazioni. Per i progetti che utilizzano node è probabile che tu voglia "CommonJS".

          Questo è un output di esempio:

          ts
          // @filename: index.ts
          import { valoreDiPi } from "./costanti";
           
          export const doppioPi = valoreDiPi * 2;
          Try

          CommonJS

          ts
          const costanti_1 = require("./costanti");
          exports.doppioPi = costanti_1.valoreDiPi * 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", "./costanti"], factory);
          }
          })(function (require, exports) {
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.doppioPi = void 0;
          const costanti_1 = require("./costanti");
          exports.doppioPi = costanti_1.valoreDiPi * 2;
          });
           
          Try

          AMD

          ts
          define(["require", "exports", "./costanti"], function (require, exports, costanti_1) {
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.doppioPi = void 0;
          exports.doppioPi = costanti_1.valoreDiPi * 2;
          });
           
          Try

          System

          ts
          System.register(["./costanti"], function (exports_1, context_1) {
          "use strict";
          var costanti_1, doppioPi;
          var __moduleName = context_1 && context_1.id;
          return {
          setters: [
          function (costanti_1_1) {
          costanti_1 = costanti_1_1;
          }
          ],
          execute: function () {
          exports_1("doppioPi", doppioPi = costanti_1.valoreDiPi * 2);
          }
          };
          });
           
          Try

          ESNext

          ts
          import { valoreDiPi } from "./costanti";
          export const doppioPi = valoreDiPi * 2;
           
          Try

          ES2020

          ts
          import { valoreDiPi } from "./costanti";
          export const doppioPi = valoreDiPi * 2;
           
          Try

          None

          ts
          "use strict";
          Object.defineProperty(exports, "__esModule", { value: true });
          exports.doppioPi = void 0;
          const costanti_1 = require("./costanti");
          exports.doppioPi = costanti_1.valoreDiPi * 2;
           
          Try

          # Module Resolution - moduleResolution

          Specify the module resolution strategy:

          • 'node16' or 'nodenext' for modern versions of Node.js. Node.js v12 and later supports both ECMAScript imports and CommonJS require, which resolve using different algorithms. These moduleResolution values, when combined with the corresponding module values, picks the right algorithm for each resolution based on whether Node.js will see an import or require in the output JavaScript code.
          • 'node10' (previously called 'node') for Node.js versions older than v10, which only support CommonJS require. You probably won’t need to use node10 in modern code.
          • 'bundler' for use with bundlers. Like node16 and nodenext, this mode supports package.json "imports" and "exports", but unlike the Node.js resolution modes, bundler never requires file extensions on relative paths in imports.
          • 'classic' was used in TypeScript before the release of 1.6. classic should not be used.

          There are reference pages explaining the theory behind TypeScript’s module resolution and the details of each option.

          # Module Suffixes - moduleSuffixes

          Provides a way to override the default list of file name suffixes to search when resolving a module.

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

          Given the above configuration, an import like the following:

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

          TypeScript will look for the relative files ./foo.ios.ts, ./foo.native.ts, and finally ./foo.ts.

          Note the empty string "" in moduleSuffixes which is necessary for TypeScript to also look-up ./foo.ts.

          This feature can be useful for React Native projects where each target platform can use a separate tsconfig.json with differing moduleSuffixes.

          # No Resolve - noResolve

          By default, TypeScript will examine the initial set of files for import and <reference directives and add these resolved files to your program.

          If noResolve is set, this process doesn’t happen. However, import statements are still checked to see if they resolve to a valid module, so you’ll need to make sure this is satisfied by some other means.

            # Paths - paths

            A series of entries which re-map imports to lookup locations relative to the baseUrl if set, or to the tsconfig file itself otherwise. There is a larger coverage of paths in the moduleResolution reference page.

            paths lets you declare how TypeScript should resolve an import in your require/imports.

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

            This would allow you to be able to write import "jquery", and get all of the correct typing locally.

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

            In this case, you can tell the TypeScript file resolver to support a number of custom prefixes to find code.

            Note that this feature does not change how import paths are emitted by tsc, so paths should only be used to inform TypeScript that another tool has this mapping and will use it at runtime or when bundling.

              # Resolve JSON Module - resolveJsonModule

              Allows importing modules with a .json extension, which is a common practice in node projects. This includes generating a type for the import based on the static JSON shape.

              TypeScript does not support resolving JSON files by default:

              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

              Enabling the option allows importing JSON, and validating the types in that JSON file.

              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

                # Resolve package.json Exports - resolvePackageJsonExports

                --resolvePackageJsonExports forces TypeScript to consult the exports field of package.json files if it ever reads from a package in node_modules.

                This option defaults to true under the node16, nodenext, and bundler options for --moduleResolution.

                # Resolve package.json Imports - resolvePackageJsonImports

                --resolvePackageJsonImports forces TypeScript to consult the imports field of package.json files when performing a lookup that starts with # from a file whose ancestor directory contains a package.json.

                This option defaults to true under the node16, nodenext, and bundler options for --moduleResolution.

                # Cartella Root - rootDir

                Default: Il più lungo percorso comune di tutti i file di input di non dichiarazione. Se composite è impostato, il default è invece la cartella che contiene il file tsconfig.json.

                Quando TypeScript compila i file, esso mantiene la stessa struttura delle cartelle che è presente nei file di input, anche nei file di output.

                Per esempio, mettiamo caso che hai alcuni file di input:

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

                Il valore predifinito di rootDir è il più lungo percorso comune di tutti i file non dichiarativi, quindi in questo caso è core/.

                Se la tua outDir era dist, TypeScript avrebbe dovuto scrivere questa struttura:

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

                Tuttavia, potresti aver impostato core come parte della struttura della cartella di output. Definendo rootDir: "." in tsconfig.json, TypeScript crea questa struttura:

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

                Importante, rootDir non interferisce con i file che diventano parte della compilazione, esso non ha interazioni con include, exclude, o con i file tsconfig.json.

                Ricorda che TypeScript non creerà mai un file di output in una cartella fuori da outDir, e non salterà mai la creazione di un file. Per questo motivo, rootDir costringe tutti i file di output ad essere emessi all’interno di rootDir.

                Per esempio, mettiamo caso tu abbia questa struttura:

                MioProj
                ├── tsconfig.json
                ├── core
                │ ├── a.ts
                │ ├── b.ts
                ├── aiutanti.ts

                Sarebbe un errore specificare rootDir come core e include come *, perché esso crea un file (aiutanti.ts) che ha bisogno di essere emesso fuori da outDir (i.e. ../aiutanti.js).

                • Default:

                  Computed from the list of input files.

                • Released:

                  1.5

                # Root Dirs - rootDirs

                Using rootDirs, you can inform the compiler that there are many “virtual” directories acting as a single root. This allows the compiler to resolve relative module imports within these “virtual” directories, as if they were merged in to one directory.

                For example:

                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"]
                }
                }

                This does not affect how TypeScript emits JavaScript, it only emulates the assumption that they will be able to work via those relative paths at runtime.

                rootDirs can be used to provide a separate “type layer” to files that are not TypeScript or JavaScript by providing a home for generated .d.ts files in another folder. This technique is useful for bundled applications where you use import of files that aren’t necessarily code:

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

                This technique lets you generate types ahead of time for the non-code source files. Imports then work naturally based off the source file’s location. For example ./src/index.ts can import the file ./src/css/main.css and TypeScript will be aware of the bundler’s behavior for that filetype via the corresponding generated declaration file.

                ts
                // @filename: index.ts
                import { appClass } from "./main.css";
                Try
                • Default:

                  Computed from the list of input files.

                • Released:

                  2.0

                # Type Roots - typeRoots

                By default all visible@types” packages are included in your compilation. Packages in node_modules/@types of any enclosing folder are considered visible. For example, that means packages within ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, and so on.

                If typeRoots is specified, only packages under typeRoots will be included. For example:

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

                This config file will include all packages under ./typings and ./vendor/types, and no packages from ./node_modules/@types. All paths are relative to the tsconfig.json.

                # Types - types

                By default all visible@types” packages are included in your compilation. Packages in node_modules/@types of any enclosing folder are considered visible. For example, that means packages within ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, and so on.

                If types is specified, only packages listed will be included in the global scope. For instance:

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

                This tsconfig.json file will only include ./node_modules/@types/node, ./node_modules/@types/jest and ./node_modules/@types/express. Other packages under node_modules/@types/* will not be included.

                What does this affect?

                This option does not affect how @types/* are included in your application code, for example if you had the above compilerOptions example with code like:

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

                The moment import would be fully typed.

                When you have this option set, by not including a module in the types array it:

                • Will not add globals to your project (e.g process in node, or expect in Jest)
                • Will not have exports appear as auto-import recommendations

                This feature differs from typeRoots in that it is about specifying only the exact types you want included, whereas typeRoots supports saying you want particular folders.

                #Emit

                # Dichiarazione - declaration

                Si possono creare dei file .d.ts per ogni file TypeScript o JavaScript all’interno del tuo progetto. Questi file .d.ts contengono delle definizioni dei file che descrivono l’API esterna al tuo modulo. Con i file .d.ts, strumenti come TypeScript possono dare intellisense e suggerimenti sui tipi per il codice senza tipo.

                Quando declaration è impostato su true, eseguendo il compilatore con questo codice TypeScript:

                ts
                export let ciaoMondo = "Ciao!";
                Try

                Esso genererà un file index.js come questo:

                ts
                export let ciaoMondo = "Ciao!";
                 
                Try

                Con un corrispondente ciaoMondo.d.ts:

                ts
                export declare let ciaoMondo: string;
                 
                Try

                Quando si lavora con i file .d.ts insieme ai file JavaScript potresti voler usare emitDeclarationOnly o outDir per essere sicuro che i file JavaScript non vengano sovrascritti.

                # Directory dichiarazioni - declarationDir

                Offre una modo di configurare la directory root in cui salvare i file di dichiarazione.

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

                con questo tsconfig.json:

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

                Inserirà i file d.ts per index.ts in una cartella tipi:

                esempio
                ├── index.js
                ├── index.ts
                ├── package.json
                ├── tsconfig.json
                └── tipi
                └── index.d.ts

                # Mappa delle dichiarazioni - declarationMap

                Crea una source map per i file .d.ts che riportano al file originale .ts. Questo permetterà agli editor come ad esempio VS Code di andare nel file .ts originale quando si usano funzioni tipo Vai alla definizione.

                Dovresti prendere seriamente in considerazione di abilitare questa funzione se stai usando le project references.

                # Iterazione di livello inferiore - downlevelIteration

                Iterazione di livello inferiore, o Downleveling, è un termine di TypeScript utilizzato per migrare verso una versione precedente di JavaScript. Questa flag permette quindi di supportare una più accurata implementazione di come il JavaScript moderno itera i nuovi concetti in versioni precedenti di JavaScript in runtime.

                ECMAScript 6 aggiunge una serie di nuove iterazioni primitive: il for / of loop (for (el of arr)), spread di Array ([a, ...b]), spread di argomenti (fn (... args)) e Symbol.iterator.--downlevelIteration permette a queste iterazioni primitive di essere utilizzate in modo più accurrato in un ambiente ES5 se un’implementazione di Symbol.iterator è presente.

                Esempio: Effetti su for / of

                Con questo codice TypeScript:

                js
                const str = "Ciao!";
                for (const s of str) {
                console.log(s);
                }

                Senza downlevelIteration attivo, un loop for / of su un qualsiasi oggetto viene convertito in un tradizionale for loop:

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

                Generalmente tutti si aspettano questo, tuttavia non è compatibile al 100% con il protocollo di iterazione ECMAScript 6. Certe string, ad esempio un emoji (😜), hanno un .length di 2 (o anche di più!), ma dovrebbero iterare come 1 unità in un for-of loop. Guarda questo blog post di Jonathan New per una spiegazione più dettagliata.

                Quando downlevelIteration è attivo, TypeScript utilizzerà una funzione ausiliaria che andrà a controllare la presenza di un Symbol.iterator (che può essere di tipo nativo o polyfill). Nel caso in cui questa implementazione non ci sia, ritornerai ad un’iterazione index-based.

                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 = "Ciao!";
                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

                Puoi utilizzare tslib via importHelpers in modo da ridurre il numero di righe inline 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 = "Ciao!";
                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

                Nota: attivare downlevelIteration non andrà a migliorare le prestazioni di compliazione se Symbol.iterator non è presente in runtime.

                Esempio: Effetti sullo spray di Array

                Questo è un spread di array:

                js
                // Crea un nuovo array composto dall'elemento 1 seguito dagli elementi di arr2
                const arr = [1, ...arr2];

                Secondo la descrizione, sembra facile convertirlo in ES5:

                js
                // Stessa cosa, no?
                const arr = [1].concat(arr2);

                Tuttavia, questo è visibilmente diverso in certi rari casi. Ad esempio, nel caso un array abbia un “buco”, l’index mancante andrà a creare una proprietà own nel caso si decida di applicare uno spread, ma non se creato utilizzando .concat:

                js
                // Crea un array dove manca l'elemento '1'
                let mancante = [0, , 1];
                let spread = [...mancante];
                let concatenato = [].concat(mancante);
                // true
                "1" in spread;
                // false
                "1" in concatenato;

                Proprio come un for / of, downlevelIteration andrà ad usare Symbol.iterator (se presente) in modo da emulare in modo più preciso il comportamento di ES 6.

                # Emit BOM - emitBOM

                Controls whether TypeScript will emit a byte order mark (BOM) when writing output files. Some runtime environments require a BOM to correctly interpret a JavaScript files; others require that it is not present. The default value of false is generally best unless you have a reason to change it.

                  # Emit Declaration Only - emitDeclarationOnly

                  Only emit .d.ts files; do not emit .js files.

                  This setting is useful in two cases:

                  • You are using a transpiler other than TypeScript to generate your JavaScript.
                  • You are using TypeScript to only generate d.ts files for your consumers.

                  # Importazione di Aiuti - importHelpers

                  TypeScript da alcuni suggerimenti per operazioni di livello inferiore come ad esempio estendere classi, spread di array o oggetti, e operazioni asincrone. In modo predefinito, questi suggerimenti vengono dati nei file che usano le operazioni elencate in precedenza. Tuttavia, nel caso in cui lo stesso suggerimento è usato in più moduli diversi, si possono verificare alcuni casi di duplicazione del codice.

                  Se l’opzione importHelpers è attiva, queste funzionalità ausiliari vengono importate dal modulo tslib. Dovrai assicurarti che il modulo tslib è in grado di essere importato in runtime. Questo riguarda solo i moduli; I file degli script globali non proveranno ad importare i moduli.

                  Per esempio, con questo codice TypeScript:

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

                  Attivando downlevelIteration, esso rimane falso:

                  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

                  Poi attivando entrambi downlevelIteration e importHelpers:

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

                  Puoi utilizzare noEmitHelpers quando metti a disposizione la tua implementazione di queste funzioni.

                  # Imports Not Used As Values - importsNotUsedAsValues

                  Deprecated in favor of verbatimModuleSyntax.

                  This flag controls how import works, there are 3 different options:

                  • remove: The default behavior of dropping import statements which only reference types.

                  • preserve: Preserves all import statements whose values or types are never used. This can cause imports/side-effects to be preserved.

                  • error: This preserves all imports (the same as the preserve option), but will error when a value import is only used as a type. This might be useful if you want to ensure no values are being accidentally imported, but still make side-effect imports explicit.

                  This flag works because you can use import type to explicitly create an import statement which should never be emitted into JavaScript.

                  # Inline Source Map - inlineSourceMap

                  When set, instead of writing out a .js.map file to provide source maps, TypeScript will embed the source map content in the .js files. Although this results in larger JS files, it can be convenient in some scenarios. For example, you might want to debug JS files on a webserver that doesn’t allow .map files to be served.

                  Mutually exclusive with sourceMap.

                  For example, with this TypeScript:

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

                  Converts to this JavaScript:

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

                  Then enable building it with inlineSourceMap enabled there is a comment at the bottom of the file which includes a source-map for the file.

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

                  # Inline Sources - inlineSources

                  When set, TypeScript will include the original content of the .ts file as an embedded string in the source map (using the source map’s sourcesContent property). This is often useful in the same cases as inlineSourceMap.

                  Requires either sourceMap or inlineSourceMap to be set.

                  For example, with this TypeScript:

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

                  By default converts to this JavaScript:

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

                  Then enable building it with inlineSources and inlineSourceMap enabled there is a comment at the bottom of the file which includes a source-map for the file. Note that the end is different from the example in inlineSourceMap because the source-map now contains the original source code also.

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

                  # Map Root - mapRoot

                  Specify the location where debugger should locate map files instead of generated locations. This string is treated verbatim inside the source-map, for example:

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

                  Would declare that index.js will have sourcemaps at https://my-website.com/debug/sourcemaps/index.js.map.

                    # New Line - newLine

                    Specify the end of line sequence to be used when emitting files: ‘CRLF’ (dos) or ‘LF’ (unix).

                    • Default:

                      lf

                    • Allowed:
                      • crlf

                      • lf

                    • Released:

                      1.5

                    # Non genera - noEmit

                    Il compilatore non genera file di output come ad esempio codice JavaScript, source maps o dichiarazioni.

                    Questo fa spazio per altri strumenti come Babel o swc per gestire la conversione di un file TypeScript in un file che può essere eseguito in un ambiente JavaScript

                    Puoi usare TypeScript come uno strumento che ti offre un integrazione da parte dell’editor e un codice sorgente tipizzato.

                      # No Emit Helpers - noEmitHelpers

                      Instead of importing helpers with importHelpers, you can provide implementations in the global scope for the helpers you use and completely turn off emitting of helper functions.

                      For example, using this async function in ES5 requires a await-like function and generator-like function to run:

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

                      Which creates quite a lot of 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

                      Which can be switched out with your own globals via this flag:

                      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

                      # No Emit On Error - noEmitOnError

                      Do not emit compiler output files like JavaScript source code, source-maps or declarations if any errors were reported.

                      This defaults to false, making it easier to work with TypeScript in a watch-like environment where you may want to see results of changes to your code in another environment before making sure all errors are resolved.

                      # Out Dir - outDir

                      Se viene specificato, i file .js (così come .d.ts, .js.map, etc.) verrano emessi in questa directory. E’ preservata la struttura della directory dei file sorgente originali; controlla rootDir se la root elaborata non è quella che quella che intendevi.

                      Se non specificato, i file .js verranno emessi nella stessa directory dei file .ts da cui sono stati generati:

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

                      Con un tsconfig.jsoncosì:

                      {
                      "opzioniCompilatore": {
                      "": "dist"
                      }
                      }

                      Eseguendo tsc con queste opzioni si andrà a spostare i file nella cartella dist specificata:

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

                      # File di output - outFile

                      Se specificato, tutti i file global (non moduli) verranno concatenati in un unico file output specificato.

                      Se module è system o amd, tutti i file module saranno concatenati in questo file dopo tutto il contenuto globale.

                      Nota: outFile non può essere a meno che module è None, System, o AMD. Questa opzione non può essere usata insieme a CommonJS o moduli ES6.

                      # Preserve Const Enums - preserveConstEnums

                      Do not erase const enum declarations in generated code. const enums provide a way to reduce the overall memory footprint of your application at runtime by emitting the enum value instead of a reference.

                      For example with this 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

                      The default const enum behavior is to convert any Album.Something to the corresponding number literal, and to remove a reference to the enum from the JavaScript completely.

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

                      With preserveConstEnums set to true, the enum exists at runtime and the numbers are still emitted.

                      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

                      This essentially makes such const enums a source-code feature only, with no runtime traces.

                      # Preserve Value Imports - preserveValueImports

                      Deprecated in favor of verbatimModuleSyntax.

                      There are some cases where TypeScript can’t detect that you’re using an import. For example, take the following code:

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

                      or code using ‘Compiles to HTML’ languages like Svelte or Vue. preserveValueImports will prevent TypeScript from removing the import, even if it appears unused.

                      When combined with isolatedModules: imported types must be marked as type-only because compilers that process single files at a time have no way of knowing whether imports are values that appear unused, or a type that must be removed in order to avoid a runtime crash.

                      # Rimuovere commenti - removeComments

                      Rimuove tutti i commenti dai file TypeScript quando avviene la conversione in JavaScript. Il valore predefinito è false.

                      Per esempio, questo è un file TypeScript che ha un commento JSDoc:

                      ts
                      /** Traduzione di 'Ciao mondo' in italiano. */
                      export const ciaoMondoIT = "Ciao mondo";

                      Quando removeComments è impostato su true:

                      ts
                      export const ciaoMondoIT = "Ciao mondo";
                       
                      Try

                      Senza aver impostato removeComments o averlo impostato su false:

                      ts
                      /** Traduzione di 'Ciao mondo' in italiano. */
                      export const ciaoMondoIT = "Ciao mondo";
                       
                      Try

                      Ciò significa che i tuoi commenti verranno visualizzati nel codice JavaScript.

                        # Source Map - sourceMap

                        Permette la generazione delle sourcemap. Questi file consentono al debugger ed ad altri strumenti di mostrare il codice TypeScript originale quando stai lavorando con il codice JavaScript generato. I file sourcemap sono generati come file js.map (o jsx.map) relativi al file .js corrispondente.

                        I file .js verranno abilitati contenendo un commento sourcemap che indica gli strumenti dove i file sono strumenti esterni. Per esempio:

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

                        Compilando come sourceMap impostata a true, crea il corrispondente file JavaScript:

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

                        E questo inoltre genererà questo json:

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

                          # Source Root - sourceRoot

                          Specify the location where a debugger should locate TypeScript files instead of relative source locations. This string is treated verbatim inside the source-map where you can use a path or a URL:

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

                          Would declare that index.js will have a source file at https://my-website.com/debug/source/index.ts.

                            # Strip Internal - stripInternal

                            Do not emit declarations for code that has an @internal annotation in its JSDoc comment. This is an internal compiler option; use at your own risk, because the compiler does not check that the result is valid. If you are searching for a tool to handle additional levels of visibility within your d.ts files, look at 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

                            With the flag set to false (default):

                            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

                            With stripInternal set to true the d.ts emitted will be redacted.

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

                            The JavaScript output is still the same.

                            • Internal

                            #JavaScript Support

                            # Consentire JS - allowJs

                            Si può consentire ai file JavaScript di poter essere importati nel tuo progetto TypeScript. Per esempio, questo file JS:

                            js
                            // @filename: carta.js
                            export const seme = "Cuori";
                            Try

                            Quando lo importi in un file TypeScript ti uscirà un errore:

                            js
                            // @filename: index.ts
                            import { seme } from "./carta";
                             
                            console.log(seme);
                            Try

                            Ma verrà importato senza errori con allowJs abilitato:

                            js
                            // @filename: index.ts
                            import { seme } from "./carta";
                             
                            console.log(seme);
                            Try

                            Questa opzione può essere usata come metodo per aggiungere file TypeScript in progetti JS permettendo ai file .ts e .tsx di coesistere con i file JavaScript esistenti.

                            # Controllo JS - checkJs

                            Funziona insieme a allowJs. Quando checkJs è abilitato gli errori sono segnalati all’interno del file JavaScript. Questo sarebbe l’equivalente di includere // @ts-check all’inizio di ogni file JavaScript che è incluso nel tuo progetto.

                            Per esempio, questo codice JavaScript è errato secondo la definizione del tipo parseFloat che è presente su TypeScript:

                            js
                            // parseFloat riceve solo una stringa
                            module.exports.pi = parseFloat(3.124);

                            Quando viene importato in un modulo TypeScript:

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

                            Non verranno segnalati errori. Tuttavia, se abiliti checkJs riceverai un messaggio di errore dal file JavaScript.

                            ts
                            // @filename: costanti.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.124);
                             
                            // @filename: index.ts
                            import { pi } from "./costanti";
                            console.log(pi);
                            Try

                            # Max Node Module JS Depth - maxNodeModuleJsDepth

                            The maximum dependency depth to search under node_modules and load JavaScript files.

                            This flag can only be used when allowJs is enabled, and is used if you want to have TypeScript infer types for all of the JavaScript inside your node_modules.

                            Ideally this should stay at 0 (the default), and d.ts files should be used to explicitly define the shape of modules. However, there are cases where you may want to turn this on at the expense of speed and potential accuracy.

                              #Editor Support

                              # Disattiva il limite di grandezza - disableSizeLimit

                              Per evitare una possibile occupazione inutile della memoria quando si lavora con progetti JavaScript molto grandi, TypeScript ha un limite sulla allocazione della memoria. Attivando questo flag rimuoverà questo limite.

                                # Plugins - plugins

                                Lista dei language service plugin da eseguire all’interno dell’editor.

                                I language service plugin sono un modo di dare più informazioni all’utente riguardo i file TypeScript esistenti. Loro possono sfruttare i messaggi di TypeScript e dell’editor per creare i loro errori.

                                Per esempio:

                                VS Code ha l’abilità grazie alle estensioni di includere automaticamente i language service plugin, quindi è probabile che ne stai già eseguendo alcuni nel tuo editor senza aver bisogno di definirli nel tsconfig.json.

                                  #Interop Constraints

                                  # Permetti Import Sintetici Predefiniti - allowSyntheticDefaultImports

                                  Quando è impostato a true, allowSyntheticDefaultImports permette di scrivere un import così:

                                  ts
                                  import React from "react";

                                  Al posto di:

                                  ts
                                  import * as React from "react";

                                  Quando un modulo non specifica esplicitamente un export predefinito.

                                  Per esempio, senza allowSyntheticDefaultImports impostato a true:

                                  ts
                                  // @filename: utilFunctions.js
                                  Module '"/home/runner/work/TypeScript-Website/TypeScript-Website/packages/typescriptlang-org/utilFunctions"' has no default export.1192Module '"/home/runner/work/TypeScript-Website/TypeScript-Website/packages/typescriptlang-org/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

                                  Questo codice segnala un errore perché un oggetto default che puoi importare non è presente.Anche se sembra che dovrebbe esserci. Per convenienza, se un oggetto default non è presente un transpiler come Babel automaticamente lo creerà.

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

                                  Questo flag non apporta cambiamenti al JavaScript emesso da TypeScript, è solo per controllare il tipo. Questa opzione porta il comportamento di TypeScript in linea con Babel emettendo un codice extra in modo di rendere l’uso di un export predefinito più ergonomico.

                                  # ES Module Interop - esModuleInterop

                                  By default (with esModuleInterop false or not set) TypeScript treats CommonJS/AMD/UMD modules similar to ES6 modules. In doing this, there are two parts in particular which turned out to be flawed assumptions:

                                  • a namespace import like import * as moment from "moment" acts the same as const moment = require("moment")

                                  • a default import like import moment from "moment" acts the same as const moment = require("moment").default

                                  This mis-match causes these two issues:

                                  • the ES6 modules spec states that a namespace import (import * as x) can only be an object, by having TypeScript treating it the same as = require("x") then TypeScript allowed for the import to be treated as a function and be callable. That’s not valid according to the spec.

                                  • while accurate to the ES6 modules spec, most libraries with CommonJS/AMD/UMD modules didn’t conform as strictly as TypeScript’s implementation.

                                  Turning on esModuleInterop will fix both of these problems in the code transpiled by TypeScript. The first changes the behavior in the compiler, the second is fixed by two new helper functions which provide a shim to ensure compatibility in the emitted JavaScript:

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

                                  With esModuleInterop disabled:

                                  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

                                  With esModuleInterop set to true:

                                  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

                                  Note: The namespace import import * as fs from "fs" only accounts for properties which are owned (basically properties set on the object and not via the prototype chain) on the imported object. If the module you’re importing defines its API using inherited properties, you need to use the default import form (import fs from "fs"), or disable esModuleInterop.

                                  Note: You can make JS emit terser by enabling importHelpers:

                                  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

                                  Enabling esModuleInterop will also enable allowSyntheticDefaultImports.

                                  # Force Consistent Casing In File Names - forceConsistentCasingInFileNames

                                  TypeScript follows the case sensitivity rules of the file system it’s running on. This can be problematic if some developers are working in a case-sensitive file system and others aren’t. If a file attempts to import fileManager.ts by specifying ./FileManager.ts the file will be found in a case-insensitive file system, but not on a case-sensitive file system.

                                  When this option is set, TypeScript will issue an error if a program tries to include a file by a casing different from the casing on disk.

                                  • Recommended
                                  • Default:

                                    true

                                  # Moduli Isolati - isolatedModules

                                  Quando usi TypeScript per produrre codice JavaScript, è usanza comune usare altri transpilers come ad esempio Babel. Tuttavia, gli altri transpilers possono operare solo su un singolo file alla volta, questo significa che non possono fare cambiamenti che dipendono dalla comprensione dell’intero progetto. Questa regola si applica anche al ts.transpileModule API di TypeScript che è usata da alcuni strumenti di esecuzione.

                                  Queste limitazioni possono causare problemi di esecuzione con alcune funzionalità di TypeScript come const enum e namespace. Impostando la flag isolatedModules chiedi a TypeScript di avvisarti se stai scrivendo del codice che non può essere correttamente interpretato da un processo di transpilation su un singolo file.

                                  Esso non cambia la forma del tuo codice e nemmeno la forma del controllo di TypeScript e il processo di emissione.

                                  Alcuni esempi di codice che non funzionano quando isolatedModules è abilitato.

                                  Esportazione di idententificatori senza valore

                                  In TypeScript, puoi importare un type e di conseguenza esportarlo:

                                  ts
                                  import { tipo, funzione } from "modulo";
                                   
                                  funzione();
                                   
                                  export { tipo, funzione };
                                  Try

                                  Dato che non ci sono valori per tipo, l’emissione export non proverà ad esportarlo (questo perché ci sarebbe un errore di esecuzione in JavaScript):

                                  js
                                  export { funzione };

                                  I transpilers a singolo file non sanno se tipo produce un valore o meno, quindi c’è un errore nell’esportazione di un nome che si riferisce solo ad un tipo.

                                  File Non-Moduli

                                  Se isolatedModules è impostato, tutti file di implementazione devono essere modules (ciò significa che esso ha alcune forme di import / export). Un errore appare se nessun file è un modulo:

                                  ts
                                  function fn() {}
                                  Try

                                  Questa regola non viene applicata ai file .d.ts

                                  Riferimenti ai membri const enum

                                  In TypeScript, quando ti riferisci ad un membro const enum, il riferimento viene rimpiazzato dal suo valore attuale nel JavaScript compilato. Cambiando questo TypeScript:

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

                                  Con questo JavaScript:

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

                                  Senza la conoscenza del valore di questi membri, gli altri transpilers non possono rimpiazzare il riferimento a Numeri, questo comporterebbe un errore di esecuzione se lasciato a se stesso (dal momento in cui non ci sono oggetti di tipo Numeri in esecuzione). A causa di questo, quando isolatedModules è impostato, c’è un errore nel riferire un ambiente ad un membro const enum.

                                    This is to reflect the same flag in Node.js; which does not resolve the real path of symlinks.

                                    This flag also exhibits the opposite behavior to Webpack’s resolve.symlinks option (i.e. setting TypeScript’s preserveSymlinks to true parallels setting Webpack’s resolve.symlinks to false, and vice-versa).

                                    With this enabled, references to modules and packages (e.g. imports and /// <reference type="..." /> directives) are all resolved relative to the location of the symbolic link file, rather than relative to the path that the symbolic link resolves to.

                                      # Verbatim Module Syntax - verbatimModuleSyntax

                                      By default, TypeScript does something called import elision. Basically, if you write something like

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

                                      TypeScript detects that you’re only using an import for types and drops the import entirely. Your output JavaScript might look something like this:

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

                                      Most of the time this is good, because if Car isn’t a value that’s exported from ./car, we’ll get a runtime error.

                                      But it does add a layer of complexity for certain edge cases. For example, notice there’s no statement like import "./car"; - the import was dropped entirely. That actually makes a difference for modules that have side-effects or not.

                                      TypeScript’s emit strategy for JavaScript also has another few layers of complexity - import elision isn’t always just driven by how an import is used - it often consults how a value is declared as well. So it’s not always clear whether code like the following

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

                                      should be preserved or dropped. If Car is declared with something like a class, then it can be preserved in the resulting JavaScript file. But if Car is only declared as a type alias or interface, then the JavaScript file shouldn’t export Car at all.

                                      While TypeScript might be able to make these emit decisions based on information from across files, not every compiler can.

                                      The type modifier on imports and exports helps with these situations a bit. We can make it explicit whether an import or export is only being used for type analysis, and can be dropped entirely in JavaScript files by using the type modifier.

                                      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 modifiers are not quite useful on their own - by default, module elision will still drop imports, and nothing forces you to make the distinction between type and plain imports and exports. So TypeScript has the flag --importsNotUsedAsValues to make sure you use the type modifier, --preserveValueImports to prevent some module elision behavior, and --isolatedModules to make sure that your TypeScript code works across different compilers. Unfortunately, understanding the fine details of those 3 flags is hard, and there are still some edge cases with unexpected behavior.

                                      TypeScript 5.0 introduces a new option called --verbatimModuleSyntax to simplify the situation. The rules are much simpler - any imports or exports without a type modifier are left around. Anything that uses the type modifier is dropped entirely.

                                      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";

                                      With this new option, what you see is what you get.

                                      That does have some implications when it comes to module interop though. Under this flag, ECMAScript imports and exports won’t be rewritten to require calls when your settings or file extension implied a different module system. Instead, you’ll get an error. If you need to emit code that uses require and module.exports, you’ll have to use TypeScript’s module syntax that predates ES2015:

                                      Input TypeScript Output 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,
                                      };

                                      While this is a limitation, it does help make some issues more obvious. For example, it’s very common to forget to set the type field in package.json under --module node16. As a result, developers would start writing CommonJS modules instead of an ES modules without realizing it, giving surprising lookup rules and JavaScript output. This new flag ensures that you’re intentional about the file type you’re using because the syntax is intentionally different.

                                      Because --verbatimModuleSyntax provides a more consistent story than --importsNotUsedAsValues and --preserveValueImports, those two existing flags are being deprecated in its favor.

                                      For more details, read up on the original pull request and its proposal issue.

                                        #Backwards Compatibility

                                        # Charset - charset

                                        Nelle versioni precedenti di TypeScript, questo controllava che tipo di codifica veniva usato quando si leggeva un file di testo dal disco. Oggi, TypeScript assume che la codifica UTF-8, pero correttamente rileverà anche UTF-16 (BE e LE) o UTF-8 BOMs.

                                        • Deprecated
                                        • Default:

                                          utf8

                                        # Keyof Strings Only - keyofStringsOnly

                                        This flag changes the keyof type operator to return string instead of string | number when applied to a type with a string index signature.

                                        This flag is used to help people keep this behavior from before TypeScript 2.9’s release.

                                        • Deprecated
                                        • Released:

                                          2.9

                                        # No Implicit Use Strict - noImplicitUseStrict

                                        You shouldn’t need this. By default, when emitting a module file to a non-ES6 target, TypeScript emits a "use strict"; prologue at the top of the file. This setting disables the prologue.

                                          # No Strict Generic Checks - noStrictGenericChecks

                                          TypeScript will unify type parameters when comparing two generic functions.

                                          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

                                          This flag can be used to remove that check.

                                          # Out - out

                                          Use outFile instead.

                                          The out option computes the final file location in a way that is not predictable or consistent. This option is retained for backward compatibility only and is deprecated.

                                          # Suppress Excess Property Errors - suppressExcessPropertyErrors

                                          This disables reporting of excess property errors, such as the one shown in the following example:

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

                                          This flag was added to help people migrate to the stricter checking of new object literals in TypeScript 1.6.

                                          We don’t recommend using this flag in a modern codebase, you can suppress one-off cases where you need it using // @ts-ignore.

                                            # Suppress Implicit Any Index Errors - suppressImplicitAnyIndexErrors

                                            Turning suppressImplicitAnyIndexErrors on suppresses reporting the error about implicit anys when indexing into objects, as shown in the following example:

                                            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

                                            Using suppressImplicitAnyIndexErrors is quite a drastic approach. It is recommended to use a @ts-ignore comment instead:

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

                                            #Language and Environment

                                            # Emit Decorator Metadata - emitDecoratorMetadata

                                            Enables experimental support for emitting type metadata for decorators which works with the module reflect-metadata.

                                            For example, here is the 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

                                            With emitDecoratorMetadata not set to true (default) the emitted JavaScript is:

                                            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

                                            With emitDecoratorMetadata set to true the emitted JavaScript is:

                                            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

                                            # Experimental Decorators - experimentalDecorators

                                            Enables experimental support for decorators, which is a version of decorators that predates the TC39 standardization process.

                                            Decorators are a language feature which hasn’t yet been fully ratified into the JavaScript specification. This means that the implementation version in TypeScript may differ from the implementation in JavaScript when it it decided by TC39.

                                            You can find out more about decorator support in TypeScript in the handbook.

                                            # JSX - jsx

                                            Controlla come i costrutti JSX vengono emessi in file Javascript. Questo influisce sull’output solo nel caso il file JS termini con .tsx.

                                            • react: Genera dei file .js con JSX modificato nelle chiamate React.createElements equivalenti.
                                            • react-jsx: Genera dei file .js con JSX modificato nelle chiamate _jsx.
                                            • react-jsxdev: Genera dei file .js con JSX modificato in chiamate _jsx.
                                            • preserve: Genera dei file .jsx con JSX invariato.
                                            • react-native: Genera dei file .js con JSX invariato.

                                            Per esempio

                                            Questo codice esempio:

                                            tsx
                                            export const ciaoMondo = () => <h1>Ciao mondo</h1>;

                                            Predefinito: "react"

                                            tsx
                                            import React from 'react';
                                            export const ciaoMondo = () => React.createElement("h1", null, "Ciao mondo");
                                             
                                            Try

                                            Conservare: "preserve"

                                            tsx
                                            import React from 'react';
                                            export const ciaoMondo = () => <h1>Ciao mondo</h1>;
                                             
                                            Try

                                            React Native: "react-native"

                                            tsx
                                            import React from 'react';
                                            export const ciaoMondo = () => <h1>Ciao mondo</h1>;
                                             
                                            Try

                                            React 17 convertito: "react-jsx"[1]

                                            tsx
                                            import { jsx as _jsx } from "react/jsx-runtime";
                                            export const ciaoMondo = () => _jsx("h1", { children: "Ciao mondo" });
                                             
                                            Try

                                            React 17 dev convertito: "react-jsxdev"[1]

                                            tsx
                                            import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
                                            const _jsxFileName = "/home/runner/work/TypeScript-Website/TypeScript-Website/packages/typescriptlang-org/index.tsx";
                                            export const ciaoMondo = () => _jsxDEV("h1", { children: "Ciao mondo" }, void 0, false, { fileName: _jsxFileName, lineNumber: 9, columnNumber: 31 }, this);
                                             
                                            Try

                                            # JSX Factory - jsxFactory

                                            Changes the function called in .js files when compiling JSX Elements using the classic JSX runtime. The most common change is to use "h" or "preact.h" instead of the default "React.createElement" if using preact.

                                            For example, this TSX file:

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

                                            With jsxFactory: "h" looks like:

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

                                            This option can be used on a per-file basis too similar to Babel’s /** @jsx h */ directive.

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

                                            The factory chosen will also affect where the JSX namespace is looked up (for type checking information) before falling back to the global one.

                                            If the factory is defined as React.createElement (the default), the compiler will check for React.JSX before checking for a global JSX. If the factory is defined as h, it will check for h.JSX before a global JSX.

                                            # JSX Fragment Factory - jsxFragmentFactory

                                            Specify the JSX fragment factory function to use when targeting react JSX emit with jsxFactory compiler option is specified, e.g. Fragment.

                                            For example with this TSConfig:

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

                                            This TSX file:

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

                                            Would look like:

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

                                            This option can be used on a per-file basis too similar to Babel’s /* @jsxFrag h */ directive.

                                            For example:

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

                                            # JSX Import Source - jsxImportSource

                                            Declares the module specifier to be used for importing the jsx and jsxs factory functions when using jsx as "react-jsx" or "react-jsxdev" which were introduced in TypeScript 4.1.

                                            With React 17 the library supports a new form of JSX transformation via a separate import.

                                            For example with this code:

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

                                            Using this TSConfig:

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

                                            The emitted JavaScript from TypeScript is:

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

                                            For example if you wanted to use "jsxImportSource": "preact", you need a tsconfig like:

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

                                            Which generates code like:

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

                                            Alternatively, you can use a per-file pragma to set this option, for example:

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

                                            Would add preact/jsx-runtime as an import for the _jsx factory.

                                            Note: In order for this to work like you would expect, your tsx file must include an export or import so that it is considered a module.

                                            # Libreria - lib

                                            TypeScript include una serie di definizioni tipo per API già incorporate in JS (come Math), o definizioni tipo per ambienti di sviluppo web (come document). TypeScript include anche API per le nuove funzionalità JS abbinandole al target specificato; per esempio il termine Map è disponibile se il target è ES6 o una versione più recente.

                                            Potresti volerli cambiare per alcuni motivi:

                                            • Il tuo programma non gira su un browser, quindi non vuoi le definizioni di tipo "dom"
                                            • La tua piattaforma di esecuzione fornisce alcuni oggetti API di JavaScript (magari attraverso dei polyfill), ma non supporta la completa sintassi di una determinata versione di ECMAScript
                                            • Hai una serie di polyfill o implementazioni native per alcuni, ma non tutti, per una versione ECMAScript di livello superiore

                                            Librerie di alto livello

                                            Nomi Contenuti
                                            ES5 Definizioni di base per tutte le funzionalità ES3 e ES5
                                            ES2015 APIs aggiuntive disponibili in ES2015 (conosciuto anche come ES6) - array.find, Promise, Proxy, Symbol, Map, Set, Reflect, etc.
                                            ES6 Alias per “ES2015”
                                            ES2016 APIs aggiuntive dispinibili in ES2016 - array.include, etc.
                                            ES7 Alias per “ES2016”
                                            ES2017 APIs aggiuntive disponibili in ES2017 - Object.entries, Object.values, Atomics, SharedArrayBuffer, date.formatToParts, array tipizzati, etc.
                                            ES2018 APIs aggiuntive disponibili in ES2018 - async iterables, promise.finally, Intl.PluralRules, rexexp.groups, etc.
                                            ES2019 APIs aggiuntive disponibili in ES2019 - array.flat, array.flatMap, Object.fromEntries, string.trimStart, string.trimEnd, etc.
                                            ES2020 APIs aggiuntive disponibili in ES2020 - string.matchAll, etc.
                                            ESNext APIs aggiuntive disponibili in ESNext - Questo cambia con l’evoluzione delle specifiche di JavaScript
                                            DOM Definizioni DOM - window, document, etc.
                                            WebWorker APIs disponibili in contesti Web Worker
                                            ScriptHost APIs per il Windows Script Hosting System

                                            Componenti di librerie individuali

                                            Nome
                                            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.Full
                                            ES2019.Object
                                            ES2019.String
                                            ES2019.Symbol
                                            ES2020.Full
                                            ES2020.String
                                            ES2020.Symbol.wellknown
                                            ESNext.AsyncIterable
                                            ESNext.Array
                                            ESNext.Intl
                                            ESNext.Symbol

                                            Questa lista potrebbe non essere aggiornata, puoi vedere la lista completa nel codice sorgente di TypeScript.

                                            # Module Detection - moduleDetection

                                            This setting controls how TypeScript determines whether a file is a script or a module.

                                            There are three choices:

                                            • "auto" (default) - TypeScript will not only look for import and export statements, but it will also check whether the "type" field in a package.json is set to "module" when running with module: nodenext or node16, and check whether the current file is a JSX file when running under jsx: react-jsx.

                                            • "legacy" - The same behavior as 4.6 and prior, usings import and export statements to determine whether a file is a module.

                                            • "force" - Ensures that every non-declaration file is treated as a module.

                                            • Default:

                                              "auto": Treat files with imports, exports, import.meta, jsx (with jsx: react-jsx), or esm format (with module: node16+) as modules.

                                            • Allowed:
                                              • legacy

                                              • auto

                                              • force

                                            • Released:

                                              4.7

                                            # No Lib - noLib

                                            Disables the automatic inclusion of any library files. If this option is set, lib is ignored.

                                            TypeScript cannot compile anything without a set of interfaces for key primitives like: Array, Boolean, Function, IArguments, Number, Object, RegExp, and String. It is expected that if you use noLib you will be including your own type definitions for these.

                                            # React Namespace - reactNamespace

                                            Use jsxFactory instead. Specify the object invoked for createElement when targeting react for TSX files.

                                            • Default:

                                              React

                                            # Target - target

                                            I browser moderni supportano tutte le nuove funzionalità di ES6, quindi ES6 è una buona scelta. Puoi scegliere di impostare un target inferiore se il tuo codice viene eseguito in ambienti più datati, o impostare un target superiore se il tuo codice è in grado di essere eseguito in ambienti più recenti.

                                            La configurazione del target cambierà quali caratteristiche di JS verranno declassate e quali rimarranno intatte. Per esempio, una funzione a freccia () => this verrà trasformata in un’espressione function equivalente se il target è ES5 o inferiore.

                                            Cambiando il target cambia anche il valore predefinito di lib. È possibile “mescolare ed abbinare” le impostazioni di target e lib come si desidera, ma è possibile semplicemente impostare il target, per comodità.

                                            Se si sta utilizzando soltanto Node.js, si consiglia la versione di target sviluppata specificamente per Node:

                                            Nome Target Supportato
                                            Node 8 ES2017
                                            Node 10 ES2018
                                            Node 12 ES2019

                                            Si basano sul database di supporto di node.green.

                                            Il valore speciale ESNext si riferisce alla versione più alta supportata dalla tua versione di TypeScript. Questa configurazione deve essere utilizzata con cautela, poiché non ha lo stesso siginificato tra le diverse versioni di TypeScript e può rendere gli aggiornamenti meno prevedibili.

                                            • Default:

                                              ES3

                                            • Allowed:
                                              • es3

                                              • es5

                                              • es6/es2015

                                              • es2016

                                              • es2017

                                              • es2018

                                              • es2019

                                              • es2020

                                              • es2021

                                              • es2022

                                              • esnext

                                            • Released:

                                              1.0

                                            # Use Define For Class Fields - useDefineForClassFields

                                            This flag is used as part of migrating to the upcoming standard version of class fields. TypeScript introduced class fields many years before it was ratified in TC39. The latest version of the upcoming specification has a different runtime behavior to TypeScript’s implementation but the same syntax.

                                            This flag switches to the upcoming ECMA runtime behavior.

                                            You can read more about the transition in the 3.7 release notes.

                                            • Default:

                                              true if target is ES2022 or higher, including ESNext; false otherwise.

                                            • Released:

                                              3.7

                                            #Compiler Diagnostics

                                            # Diagnostica - diagnostics

                                            Viene usato per generare informazioni diagnostiche per debuggare. Questo comando è un sottoinsieme di extendedDiagnostics, che sono delle informazioni rivolte all’utente e più facili da interpretare.

                                            Se ti è stato chiesto da un ingegnere del compilatore TypeScript di dare il risultato della compilazione usando questo flag, non vi è nessun danno nell’usare invece --extendedDiagnostics.

                                            # Explain Files - explainFiles

                                            Print names of files which TypeScript sees as a part of your project and the reason they are part of the compilation.

                                            For example, with this project of just a single index.ts file

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

                                            Using a tsconfig.json which has explainFiles set to true:

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

                                            Running TypeScript against this folder would have output like this:

                                            ❯ 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'

                                            The output above show:

                                            • The initial lib.d.ts lookup based on target, and the chain of .d.ts files which are referenced
                                            • The index.ts file located via the default pattern of include

                                            This option is intended for debugging how a file has become a part of your compile.

                                            # Extended Diagnostics - extendedDiagnostics

                                            You can use this flag to discover where TypeScript is spending its time when compiling. This is a tool used for understanding the performance characteristics of your codebase overall.

                                            You can learn more about how to measure and understand the output in the performance section of the wiki.

                                            # Generate CPU Profile - generateCpuProfile

                                            This option gives you the chance to have TypeScript emit a v8 CPU profile during the compiler run. The CPU profile can provide insight into why your builds may be slow.

                                            This option can only be used from the CLI via: --generateCpuProfile tsc-output.cpuprofile.

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

                                            This file can be opened in a chromium based browser like Chrome or Edge Developer in the CPU profiler section. You can learn more about understanding the compilers performance in the TypeScript wiki section on performance.

                                            • Default:

                                              profile.cpuprofile

                                            • Released:

                                              3.7

                                            # List Emitted Files - listEmittedFiles

                                            Print names of generated files part of the compilation to the terminal.

                                            This flag is useful in two cases:

                                            • You want to transpile TypeScript as a part of a build chain in the terminal where the filenames are processed in the next command.
                                            • You are not sure that TypeScript has included a file you expected, as a part of debugging the file inclusion settings.

                                            For example:

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

                                            With:

                                            {
                                            "": true,
                                            }
                                            }

                                            Would echo paths like:

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

                                            Normally, TypeScript would return silently on success.

                                              # List Files - listFiles

                                              Print names of files part of the compilation. This is useful when you are not sure that TypeScript has included a file you expected.

                                              For example:

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

                                              With:

                                              {
                                              "": true
                                              }
                                              }

                                              Would echo paths like:

                                              $ 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

                                              Note if using TypeScript 4.2, prefer explainFiles which offers an explanation of why a file was added too.

                                              # Trace Resolution - traceResolution

                                              When you are trying to debug why a module isn’t being included. You can set traceResolution to true to have TypeScript print information about its resolution process for each processed file.

                                              #Projects

                                              # Componi - composite

                                              L’opzione composite applica delle regole che permettono agli strumenti di build (incluso Typescript stesso, sotto --build mode) di determinare velocemente se un progetto è già stato compilato.

                                              Quando esso è attivato:

                                              • L’opzione rootDir, se non impostata esplicitamente, imposta in modo predefinito la cartella in cui si trova il tsconfig.json file.

                                              • Tutti i file implementati devono corrispondere ad un include o devono essere indicati nell’array files. Se questa regola non viene rispettata, tsc ti informerà su quali file non sono stati specificati.

                                              • declaration è predefinito su true

                                              Puoi trovare la documentazione sui progetti TypeScript nella guida.

                                              # Disabilita il caricamento del progetto di riferimento - disableReferencedProjectLoad

                                              In programmi multi progetto di TypeScript, questa caricherà tutti i progetti disponibili in memoria con l’obbiettivo di fornire un risultato più accurato per l’editor che richiede un grafico di conoscenza completo come “Trova tutti i riferimenti”.

                                              Se il tuo progetto è grande, puoi usare il flag disableReferencedProjectLoad per disabilitare il caricamento automatico di tutti i progetti. Cosi i progetti vengono caricati dinamicamente quando apri le cartelle attraverso il tuo editor.

                                              # Disable Solution Searching - disableSolutionSearching

                                              When working with composite TypeScript projects, this option provides a way to declare that you do not want a project to be included when using features like find all references or jump to definition in an editor.

                                              This flag is something you can use to increase responsiveness in large composite projects.

                                              # Disable Source Project Reference Redirect - disableSourceOfProjectReferenceRedirect

                                              When working with composite TypeScript projects, this option provides a way to go back to the pre-3.7 behavior where d.ts files were used to as the boundaries between modules. In 3.7 the source of truth is now your TypeScript files.

                                              # Incrementale - incremental

                                              Dice a TypeScript di salvare le informazioni riguardo il grafo del progetto dall’ultima compliazione nei file salvati nel disco. Questo crea una serie di file .tsbuildinfo nella stessa cartella del risultato della compilazione. Essi non vengono usati dal tuo JavaScript durante l’esecuzione e possono essere tranquillamente eliminati. Puoi saperne di più riguardo questa flag nelle 3.4 note di rilascio.

                                              Per scegliere in che cartella vuoi i tuoi file compilati, usa l’opzione di configurazione tsBuildInfoFile.

                                              # File di informazioni sulla build di TS - tsBuildInfoFile

                                              Questa configurazione consente di specificare un file per memorizzare le informazioni di compilazione incrementale come parte di progetti compositi che consente la creazione più rapida di basi di codice TypeScript più grandi. Puoi leggere di più sui progetti comopositi nel manuale.

                                              Questa opzione offre un modo di configurare il posto dove TypeScript tiene traccia dei file che memorizza sul disco per indicare lo stato di compilazione di un progetto — di default, si trovano nella stessa cartella del JavaScript generato.

                                              #Output Formatting

                                              # No Error Truncation - noErrorTruncation

                                              Do not truncate error messages.

                                              With false, the default.

                                              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

                                              With 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

                                                # Preserve Watch Output - preserveWatchOutput

                                                Whether to keep outdated console output in watch mode instead of clearing the screen every time a change happened.

                                                • Internal

                                                # Pretty - pretty

                                                Stylize errors and messages using color and context, this is on by default — offers you a chance to have less terse, single colored messages from the compiler.

                                                • Default:

                                                  true

                                                #Completeness

                                                # Skip Default Lib Check - skipDefaultLibCheck

                                                Use skipLibCheck instead. Skip type checking of default library declaration files.

                                                  # Skip Lib Check - skipLibCheck

                                                  Skip type checking of declaration files.

                                                  This can save time during compilation at the expense of type-system accuracy. For example, two libraries could define two copies of the same type in an inconsistent way. Rather than doing a full check of all d.ts files, TypeScript will type check the code you specifically refer to in your app’s source code.

                                                  A common case where you might think to use skipLibCheck is when there are two copies of a library’s types in your node_modules. In these cases, you should consider using a feature like yarn’s resolutions to ensure there is only one copy of that dependency in your tree or investigate how to ensure there is only one copy by understanding the dependency resolution to fix the issue without additional tooling.

                                                  Another possibility is when you are migrating between TypeScript releases and the changes cause breakages in node_modules and the JS standard libraries which you do not want to deal with during the TypeScript update.

                                                  Note, that if these issues come from the TypeScript standard library you can replace the library using TypeScript 4.5’s lib replacement technique.

                                                  • Recommended
                                                  • Released:

                                                    2.0

                                                  #Command Line

                                                  #Watch Options

                                                  TypeScript 3.8 shipped a new strategy for watching directories, which is crucial for efficiently picking up changes to node_modules.

                                                  On operating systems like Linux, TypeScript installs directory watchers (as opposed to file watchers) on node_modules and many of its subdirectories to detect changes in dependencies. This is because the number of available file watchers is often eclipsed by the number of files in node_modules, whereas there are way fewer directories to track.

                                                  Because every project might work better under different strategies, and this new approach might not work well for your workflows, TypeScript 3.8 introduces a new watchOptions field which allows users to tell the compiler/language service which watching strategies should be used to keep track of files and directories.

                                                  # Assicura Che I Cambiamenti Influiscano Soltanto Su Dipendenze Dirette - assumeChangesOnlyAffectDirectDependencies

                                                  Quando questa opzione viene abilitata, TypeScript eviterà la verifica/ricostruzione di assolutamente tutti i file, e verificherà/ricostruirà solo i file che sono stati modificati o che potrebbero essere stati interessati dalle modifiche.

                                                  Questo può essere considerato come una implementazione rapida (fast & loose) del algoritmo watching che può drasticamente ridurre i tempi di ricostruzione a scapito di dover eseguire occasionalmente la compilazione completa per ottenere tutti i messaggi di errore del compilatore.

                                                  # watchFile - watchFile

                                                  Definisce la strategia in quanto i singoli file dovrebbero essere osservati per le modifiche

                                                  • fixedPollingInterval: Controlla tutti i file per le modifiche più volte al secondo a un intervallo predeterminato.
                                                  • priorityPollingInterval: Controlla tutti i file per le modifiche più volte al secondo, ma utilizzando l’euristica per controllare alcuni tipi di file più spesso di altri.
                                                  • dynamicPriorityPolling: Utilizza una coda dinamica in cui i file meno modificati vengono controllati meno frequentemente.
                                                  • useFsEvents (modelo): Tentativi di utilizzare la funzionalità degli eventi di modifica dei file nativi del sistema operativo.
                                                  • useFsEventsOnParentDirectory: Tentativi di utilizzare l’implementazione nativa del sistema operativo degli eventi di modifica per rilevare le modifiche alla directory padre di un file.
                                                  • Allowed:
                                                    • fixedpollinginterval

                                                    • prioritypollinginterval

                                                    • dynamicprioritypolling

                                                    • fixedchunksizepolling

                                                    • usefsevents

                                                    • usefseventsonparentdirectory

                                                  • Released:

                                                    3.8

                                                  # Watch Directory - watchDirectory

                                                  The strategy for how entire directory trees are watched under systems that lack recursive file-watching functionality.

                                                  • fixedPollingInterval: Check every directory for changes several times a second at a fixed interval.
                                                  • dynamicPriorityPolling: Use a dynamic queue where less-frequently modified directories will be checked less often.
                                                  • useFsEvents (the default): Attempt to use the operating system/file system’s native events for directory changes.
                                                  • Allowed:
                                                    • usefsevents

                                                    • fixedpollinginterval

                                                    • dynamicprioritypolling

                                                    • fixedchunksizepolling

                                                  • Released:

                                                    3.8

                                                  # Fallback Polling - fallbackPolling

                                                  When using file system events, this option specifies the polling strategy that gets used when the system runs out of native file watchers and/or doesn’t support native file watchers.

                                                  • fixedPollingInterval: Check every file for changes several times a second at a fixed interval.
                                                  • priorityPollingInterval: Check every file for changes several times a second, but use heuristics to check certain types of files less frequently than others.
                                                  • dynamicPriorityPolling: Use a dynamic queue where less-frequently modified files will be checked less often.
                                                  • synchronousWatchDirectory: Disable deferred watching on directories. Deferred watching is useful when lots of file changes might occur at once (e.g. a change in node_modules from running npm install), but you might want to disable it with this flag for some less-common setups.
                                                  • Allowed:
                                                    • fixedinterval

                                                    • priorityinterval

                                                    • dynamicpriority

                                                    • fixedchunksize

                                                  • Released:

                                                    3.8

                                                  # Synchronous Watch Directory - synchronousWatchDirectory

                                                  Synchronously call callbacks and update the state of directory watchers on platforms that don`t support recursive watching natively. Instead of giving a small timeout to allow for potentially multiple edits to occur on a file.

                                                  {
                                                  "watchOptions": {
                                                  }
                                                  }

                                                    # Exclude Directories - excludeDirectories

                                                    You can use excludeFiles to drastically reduce the number of files which are watched during --watch. This can be a useful way to reduce the number of open file which TypeScript tracks on Linux.

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

                                                      # Exclude Files - excludeFiles

                                                      You can use excludeFiles to remove a set of specific files from the files which are watched.

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

                                                        Type Acquisition

                                                        Type Acquisition is only important for JavaScript projects. In TypeScript projects you need to include the types in your projects explicitly. However, for JavaScript projects, the TypeScript tooling will download types for your modules in the background and outside of your node_modules folder.

                                                        # Enable - enable

                                                        Disables automatic type acquisition in JavaScript projects:

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

                                                          # Include - include

                                                          If you have a JavaScript project where TypeScript needs additional guidance to understand global dependencies, or have disabled the built-in inference via disableFilenameBasedTypeAcquisition.

                                                          You can use include to specify which types should be used from DefinitelyTyped:

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

                                                          # Exclude - exclude

                                                          Offers a config for disabling the type-acquisition for a certain module in JavaScript projects. This can be useful for projects which include other libraries in testing infrastructure which aren’t needed in the main application.

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

                                                          # Disable Filename Based Type Acquisition - disableFilenameBasedTypeAcquisition

                                                          TypeScript’s type acquisition can infer what types should be added based on filenames in a project. This means that having a file like jquery.js in your project would automatically download the types for JQuery from DefinitelyTyped.

                                                          You can disable this via disableFilenameBasedTypeAcquisition.

                                                          json
                                                          {
                                                          "typeAcquisition": {
                                                          "disableFilenameBasedTypeAcquisition": true
                                                          }
                                                          }