Marius Schulz
Marius Schulz
Front End Engineer

The --strict Compiler Option in TypeScript

TypeScript 2.3 introduced a new --strict compiler option that enables a number of other compiler options related to stricter type checking.

#Strict Type Checking Options

The idea is that you opt into a strict-by-default mode so that you enjoy all the benefits of better type safety without having to enable each compiler option separately. You can either set the --strict flag on the command line or specify the strict option within your project's tsconfig.json file to opt into this mode.

As of TypeScript 2.3 in early June 2017, the --strict flag enables the following four compiler options:

  • --strictNullChecks
  • --noImplicitAny
  • --noImplicitThis
  • --alwaysStrict

Future versions of TypeScript might add additional type checking options to this set. This means you don't necessarily have to monitor each TypeScript release for new strictness options that you should enable in your project. If new options are added to the option set above, they'll be active automatically once you upgrade your project's TypeScript version.

#Opting Out of Certain Options

Every option enabled by --strict can be configured independently. That is, you can still override all the defaults without having to give up defaulting to strict mode.

An example: Let's say you want all strict type checking options enabled except for --alwaysStrict which makes the compiler parse all source files in strict mode and emit "use strict"; directives. In that case, you can specify the following options in your tsconfig.json configuration file:

  "strict": true,
  "alwaysStrict": false

This configuration works as you would expect and enables all strict type checking options except --alwaysStrict. You'll still automatically benefit from new strictness options as they're added in the future.

#Scaffolding a Configuration File with tsc --init

To help you get started with a new TypeScript project, the compiler can scaffold a configuration file for you:

$ tsc --init
message TS6071: Successfully created a tsconfig.json file.

After running this command, you'll find a tsconfig.json file in the current working directory. The generated configuration can look something like this:

  "compilerOptions": {
    /* Basic Options */
    "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'. */
    // "lib": [],                             /* Specify library files to be included in the compilation:  */
    // "allowJs": true,                       /* Allow javascript files to be compiled. */
    // "checkJs": true,                       /* Report errors in .js files. */
    // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    // "outDir": "./",                        /* Redirect output structure to the directory. */
    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "removeComments": true,                /* Do not emit comments to output. */
    // "noEmit": true,                        /* Do not emit outputs. */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true                            /* Enable all strict type-checking options. */
    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
    // "strictNullChecks": true,              /* Enable strict null checks. */
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */

    /* Additional Checks */
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */

    /* Module Resolution Options */
    // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
    // "types": [],                           /* Type declaration files to be included in compilation. */
    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */

    /* Source Map Options */
    // "sourceRoot": "./",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "./",                       /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */

Note that --strict is enabled by default. This means that you'll automatically be opted into the strict-by-default mode when starting a new TypeScript project.

This post is part of the TypeScript Evolution series.

Buy Me a Coffee