incremental
false
。incremental
设置为true
,TypeScript 编译器会记住上次编译的结果,并只重新编译那些发生了变化的文件。composite
false
。tsBuildInfoFile
''
。"tsBuildInfoFile": "./buildInfo.json"
。disableSourceOfProjectReferenceRedirect
false
。编译器将根据项目引用的配置进行源文件重定向。disableSourceOfProjectReferenceRedirect
设置为 true 时,编译器将禁用源文件重定向。disableSolutionSearching
false
。编译器可能会在多个项目中搜索解决方案,以解决类型引用等问题。disableSolutionSearching
设置为 true 时,编译器将不会在多个项目中搜索解决方案。disableReferencedProjectLoad
false
。编译器会根据项目引用关系加载和处理被引用的项目。disableReferencedProjectLoad
设置为 true 时,编译器将不会加载被引用的项目。target
es3
。lib
正常情况下,前端代码在浏览器中运行,是不需要设置
lib
的。在tsconfig.json
中,默认情况下,是被注释的。
lib
的默认值取决于目标运行环境(target
选项的值)。
target
是 es5
,默认包含的库有 DOM
、ES5
、ScriptHost
。target
是 es6
,默认包含的库会更多一些,以适应 ES6 的特性,如 DOM
、ES6
、ScriptHost
等。['es6', 'dom']
jsx
preserve
:保留 JSX 代码不变,不进行任何转换。输出文件会带有.jsx
扩展名。react
:生成的代码会调用React.createElement
或类似的函数来创建 React
元素。输出文件的扩展名为.js
。react-native
:保留 JSX 为原始的样子,不进行转换。输出文件的扩展名为.js
。类似于 react
,但针对 React Native 环境进行优化。生成的代码适用于 React Native 应用程序。experimentalDecorators
false
。true
时,TypeScript 编译器将识别和处理装饰器。emitDecoratorMetadata
false
。true
时,TypeScript 编译器会在生成的 JavaScript 代码中包含关于装饰器的元数据。emitDecoratorMetadata
,通常还需要同时设置 experimentalDecorators
为 true
,因为装饰器本身在 TypeScript 中是实验性特性。jsxFactory
jsx
选项设置为 react
时,TypeScript 会使用 React.createElement
作为 JSX 转换的工厂函数。通过设置 jsxFactory
,可以指定不同的工厂函数名称,以便与特定的库或框架集成。React
的变量,但它不是 React
库的实例,设置 jsxFactory
可以避免与现有变量的命名冲突,并确保正确的 JSX 转换。示例:
{
"compilerOptions": {
"jsx": "react",
"jsxFactory": "MyCustomCreateElement"
}
}
在这个例子中,当处理 JSX 代码时,TypeScript 编译器将使用名为 MyCustomCreateElement
的函数作为工厂函数,而不是默认的 React.createElement
。
jsxFragmentFactory
<>
和 >
包裹的内容)时,TypeScript 默认会使用 React.Fragment
(如果 jsx 选项设置为 react)作为片段的容器。通过设置 jsxFragmentFactory
,可以指定不同的工厂函数来创建片段容器。jsxImportSource
jsxImportSource
,可以指定一个特定的模块路径,以便在编译时正确导入所需的 JSX 处理功能。示例:
{
"compilerOptions": {
"jsx": "react",
"jsxImportSource": "my-custom-jsx-library"
}
}
在这个例子中,当处理 JSX 代码时,TypeScript 编译器将从 "my-custom-jsx-library"
模块导入用于处理 JSX 的函数或对象,而不是默认的 React 库。
reactNamespace
reactNamespace
,可以告诉 TypeScript 在编译时使用指定的命名空间来识别 React 组件和相关功能。reactNamespace
选项可以帮助 TypeScript 正确地处理这些情况。示例:
{
"compilerOptions": {
"jsx": "react",
"reactNamespace": "MyCustomReactNamespace"
}
}
在这个例子中,TypeScript 编译器将在全局命名空间中查找名为 "MyCustomReactNamespace
"的对象来识别 React 相关的功能。
noLib
lib.d.ts
)。false
。true
后,TypeScript 编译器不会自动包含默认的库文件。开发者需要手动指定要包含的库文件,可以通过在 tsconfig.json
中的 files
、includes
或 references
等选项来指定特定的文件或项目,以确保所需的类型定义被包含。useDefineForClassFields
false
,类字段的初始化可能会在构造函数中进行。true
时,类字段的初始化将遵循特定的规则,通常是在类定义中进行初始化。moduleDetection
auto
(默认值):TypeScript 编译器会自动尝试检测模块的类型。它会根据导入语句的形式、文件扩展名等因素来确定模块的格式,例如 CommonJS
、ES6
模块等。force
:强制编译器将所有文件视为模块,即使没有明确的导入或导出语句。这可以在某些情况下确保一致性,但可能会导致一些意外的结果,特别是对于一些传统的脚本文件。module
"commonjs"
。rootDir
./
。示例:
{
"compilerOptions": {
"rootDir": "./src"
}
}
在这个例子中,TypeScript 编译器将从当前目录下的 src
目录开始查找源文件。
moduleResolution
"node"
。"node"
:这是默认的模块解析策略。它模仿了 Node.js 的模块解析方式,优先在当前目录下查找模块文件,如果找不到,则向上一级目录查找,直到找到模块文件或者到达文件系统的根目录。此外,它还支持使用 node_modules
目录来查找第三方模块。"classic"
:这种模块解析策略使用传统的 TypeScript 模块解析方式。它根据模块的相对路径或绝对路径来查找模块文件,不依赖于特定的运行时环境。"node16"
、"nodenext"
:这些是针对特定版本的 Node.js 的模块解析策略。它们在功能上与 "node"
类似,但可能会根据不同的 Node.js 版本进行一些调整和优化。baseUrl
tsconfig.json
文件的目录)。如果没有显式设置 baseUrl
,TypeScript 编译器在解析模块导入时将从当前工作目录开始查找模块文件。baseUrl
,可以为项目中的模块导入提供一个相对的基础路径。这使得在导入模块时可以使用相对较短的路径,提高代码的可读性和可维护性。baseUrl
可以限制模块解析器在特定的目录范围内查找模块。这有助于避免模块解析器在不必要的目录中进行搜索,提高编译性能。项目结构如下:
project/
├── src/
│ ├── modules/
│ │ ├── moduleA.ts
│ │ └── moduleB.ts
│ └── index.ts
└── tsconfig.json
tsconfig.json
配置:
{
"compilerOptions": {
"baseUrl": "./src",
"module": "commonjs",
"outDir": "./dist"
}
}
在这个例子中,baseUrl
被设置为 ./src
。这意味着当在项目中导入模块时,TypeScript 编译器将从 ./src
目录开始查找模块。
模块 moduleA
位于 ./src/modules/moduleA.ts
,可以使用以下方式导入:
import moduleA from 'modules/moduleA';
paths
paths
没有默认值,默认为一个空对象 {}
。paths
选项需要与 baseUrl
一起使用。baseUrl
指定了模块解析的基础路径,而 paths
中的别名是相对于 baseUrl
的。paths
配置中的别名,而不需要在整个项目中修改所有的模块导入路径。示例:
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@components/*": ["src/components/*"],
"@utils/*": ["src/utils/*"]
}
}
}
在这个例子中,设置了两个路径别名:
"@components/*"
指向 "src/components/*"
。这意味着可以使用 @components/SomeComponent
来导入位于 src/components/SomeComponent
的模块。"@utils/*"
指向 "src/utils/*"
。可以使用 @utils/someUtility
来导入位于 src/utils/someUtility
的模块。rootDirs
[]
。项目结构如下:
project/
├── src/
│ ├── views/
│ │ ├── viewA.ts
│ │ └── viewB.ts
│ └── templates/
│ ├── templateA.ts
│ └── templateB.ts
└── tsconfig.json
tsconfig.json
配置:
{
"compilerOptions": {
"rootDirs": ["src/views", "src/templates"]
}
}
在这个例子中,rootDirs
被设置为包含两个目录:src/views
和 src/templates
。在编译过程中,这两个目录将被视为一个逻辑目录,可以在代码中进行模块导入和引用。
例如,如果在 src/views
中有一个模块 viewModule.ts
,在 src/templates
中有一个模块 templateModule.ts
,可以在其他文件中进行如下导入:
import viewModule from 'views/viewModule';
import templateModule from 'templates/templateModule';
typeRoots
.d.ts
文件)的查找路径。["node_modules/@types"]
。 如果没有显式设置 typeRoots
,TypeScript 编译器会在项目的 node_modules/@types
目录中查找类型声明文件。这个目录通常是存放第三方库的类型声明的地方。项目结构:
project/
├── node_modules/
│ └── @types/
│ └── some-library/
│ └── index.d.ts
├── custom-types/
│ └── custom-type.d.ts
└── tsconfig.json
tsconfig.json
配置:
{
"compilerOptions": {
"typeRoots": [
"./node_modules/@types",
"./custom-types"
]
}
}
设置 typeRoots
为 ["./node_modules/@types", "./custom-types"]
可以让编译器在这两个目录中查找类型声明文件。
types
[]
。如果没有显式设置 types,TypeScript 编译器不会自动包含任何特定的额外类型声明文件。它只会根据默认的类型查找规则(如在 node_modules/@types
目录中查找已安装库的类型声明)来解析类型。示例:
{
"compilerOptions": {
"types": ["jquery", "lodash"]
}
}
types
被设置为包含 "jquery"
和 "lodash"
。这意味着 TypeScript 编译器将包含 jquery
和 lodash
的类型声明文件。
allowUmdGlobalAccess
false
,不允许直接访问全局变量,需要通过适当的导入或其他方式来获取模块中的功能。true
时,TypeScript 编译器允许在代码中访问 UMD 模块可能创建的全局变量。moduleSuffixes
[]
。TypeScript 编译器只会按照默认的模块解析规则查找模块文件,不会尝试不同的后缀名。moduleSuffixes
中后缀名的顺序很重要。编译器会按照列表中的顺序依次尝试查找模块文件。通常,应该将最常用的后缀名放在前面,以提高查找效率。moduleSuffixes
选项可能需要与其他配置选项(如 moduleResolution
、paths
等)一起使用,以确保项目的正确编译和模块解析。示例:
{
"compilerOptions": {
"moduleSuffixes": [".js", ".ts", ".json"]
}
}
在这个例子中,moduleSuffixes
被设置为包含 .js
、.ts
和 .json
三个后缀名。当 TypeScript 编译器解析模块导入时,它会尝试查找具有这些后缀名的文件。
allowImportingTsExtensions
.ts
为扩展名的文件时省略扩展名。false
。在默认情况下,必须在导入语句中明确指定 .ts
扩展名才能正确导入 TypeScript 文件。true
,可以在导入语句中省略 .ts
扩展名,示例:
// allowImportingTsExtensions: false
import { someFunction } from './module.ts';
// allowImportingTsExtensions: true
import { someFunction } from './module';
resolvePackageJsonExports
package.json
文件中的 "exports"
字段来确定模块的入口点。false
。在默认情况下,TypeScript 编译器不会解析 package.json
文件中的 "exports"
字段来确定模块入口点。它不会考虑 "exports"字段,按照常规方式查找模块文件。true
时,TypeScript 编译器会根据当前的模块格式(如 "import"
对应 ES
模块,"require"
对应 CommonJS
模块)选择正确的入口文件进行解析。示例:
// package.json
{
"exports": {
".": {
"import": "./esm/index.mjs",
"require": "./cjs/index.cjs"
}
}
}
resolvePackageJsonImports
package.json
文件中的 "imports"
字段来确定模块的入口点。false
。TypeScript 编译器不会解析 package.json文件中的 "imports"字段来确定模块入口点。它不会考虑 "imports"
字段,按照常规方式查找模块文件。true
,在导入 "@my-library/some-module"
时,TypeScript 编译器会根据 "imports"
字段中的配置找到对应的入口文件。示例:
// package.json
{
"imports": {
"@my-library/some-module": "./path/to/specific/entry.js"
}
}
customConditions
[]
。在默认情况下,TypeScript 编译器只会使用内置的模块解析规则,不会考虑任何自定义条件。例如,如果想要根据不同的环境加载不同的模块,可以设置自定义条件:
{
"compilerOptions": {
"customConditions": ["development", "production"]
}
}
在代码中,可以根据条件进行模块导入:
if (import.meta.env.MODE === "development") {
const module = await import("./module.dev.js");
} else {
const module = await import("./module.prod.js");
}
resolveJsonModule
.json
文件作为模块。false
。在默认情况下,TypeScript 编译器不允许直接导入 .json
文件作为模块。如果要导入 .json
文件,通常需要使用其他方式,如通过 fs
模块在运行时读取文件内容。true
,TypeScript 编译器允许直接导入 .json
文件作为模块。示例:
当 resolveJsonModule
为 false
时:
// 无法直接导入 json 文件作为模块
// import data from './data.json'; // 会报错
import * as fs from 'fs';
const data = JSON.parse(fs.readFileSync('./data.json', 'utf8'));
当 resolveJsonModule
为 true
时:
import data from './data.json';
console.log(data);
allowArbitraryExtensions
false
。在默认情况下,TypeScript 编译器只允许使用常见的模块文件扩展名(如 .js
、.ts
、.json
等)进行模块导入。如果尝试使用其他任意扩展名的文件进行导入,会导致编译错误。true
,TypeScript 编译器允许使用任意文件扩展名作为模块导入。示例:
假设 data.custom
文件中包含有效的 JavaScript 或 TypeScript 代码,或者是可以在运行时被正确解析的数据格式。
// 以下导入会报错,因为默认不允许使用.custom 扩展名作为模块
import data from './data.custom';
当allowArbitraryExtensions
是 false
,导入会报错,因为默认不允许使用.custom
扩展名作为模块。
当allowArbitraryExtensions
是 true
, 导入成功。
noResolve
false
。在默认情况下,TypeScript 编译器会进行模块解析,尝试找到导入的模块并确定其位置。true
,需要在运行时确保正确地加载和处理那些没有被解析的模块。
注意:设置
noResolve
为true
会有很多风险和影响,要在开发过程中采取相应的措施来确保代码的正确性和稳定性。
allowJs
false
。在默认情况下,TypeScript 编译器只处理 .ts
、.tsx
和 .d.ts
文件,不会编译 .js
文件。checkJs
maxNodeModuleJsDepth
node_modules
目录中搜索的最大深度。node_modules
目录中尽可能深地搜索以找到所需的 JavaScript 文件。number
。declaration
.d.ts
文件)。false
。在默认情况下,TypeScript 编译器不会生成声明文件。true
,TypeScript 编译器会为每个 .ts
文件生成相应的 .d.ts
声明文件。这些声明文件包含了类型定义、接口、函数签名等信息,使得其他项目可以在不访问实际的 .ts
源代码的情况下使用你的代码的类型信息。例如,项目中有一个 TypeScript 文件 example.ts
:
export function add(a: number, b: number): number {
return a + b;
}
设置 declaration
为 true
后,会生成一个 example.d.ts
文件:
export declare function add(a: number, b: number): number;
declarationMap
.d.ts.map
文件)。false
。在默认情况下,TypeScript 编译器不会生成声明文件的源映射文件。declarationMap
选项通常与 declaration
选项一起使用。如果 declaration
为 false
,即使开启 declarationMap
也不会生成源映射文件,因为没有声明文件可供映射。假设开启了 declaration
和 declarationMap
选项,TypeScript 编译器会给.ts
文件生成一个 .d.ts
声明文件和一个 .d.ts.map
源映射文件。
emitDeclarationOnly
.d.ts
文件)而不生成任何 JavaScript 输出文件。false
。在默认情况下,TypeScript 编译器会同时生成声明文件(如果 declaration
选项为 true
)和 JavaScript 输出文件。true
时,TypeScript 编译器只生成声明文件,不生成任何 JavaScript 输出文件。emitDeclarationOnly
选项通常与 declaration
选项一起使用。如果 declaration
为 false
,即使设置 emitDeclarationOnly
为 true
也不会生成任何文件,因为没有声明文件可供生成。sourceMap
.map
文件)。false
。在默认情况下,TypeScript 编译器不会生成源映射文件。示例:
{
"compilerOptions": {
"sourceMap": true
}
}
sourceMap
设置为 true
,TypeScript 编译器编译.ts
文件后,除了生成 .js
文件外,还会生成一个 .js.map
源映射文件。
inlineSourceMap
false
。在默认情况下,TypeScript 编译器会生成单独的源映射文件(.map
文件),不会把源映射信息内联到 JavaScript 文件中。如果将 inlineSourceMap
设置为 true
,生成的 JavaScript 文件可能会包含类似以下的注释:
//@ sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb...
这表示源映射信息已内联到该文件中。
inlineSourceMap
选项可以在一定程度上简化项目部署和减少文件请求,但需要考虑文件大小增加、隐私安全和调试工具支持等问题。
outFile
undefined
,即没有默认的输出文件合并行为。在默认情况下,TypeScript 编译器会为每个输入的 TypeScript 文件生成单独的 JavaScript 文件,不会进行合并输出。在 tsconfig.json
文件中设置 outFile
选项,指定输出文件的路径和名称。例如:
{
"compilerOptions": {
"outFile": "dist/bundle.js"
}
}
这将把所有编译后的 JavaScript 文件合并输出到 dist/bundle.js
文件中。
outDir
undefined
。在默认情况下,编译后生成的 .js
文件会出现在与 .ts
相同的目录中。在 tsconfig.json
文件中设置 outDir
选项,指定输出目录的路径。例如:
{
"compilerOptions": {
"outDir": "dist"
}
}
这将把编译生成的文件输出到 dist
目录中。
removeComments
true
,在编译过程中删除注释,编译后的 JavaScript 文件中不会包含注释。noEmit
declaration
选项为 true
)。true
,TypeScript 编译器只会进行类型检查,不会生成任何输出文件。importHelpers
false
。在默认情况下,TypeScript 编译器不会引入导入助手函数。例如,如果有以下 TypeScript 代码:
import { add } from './math';
console.log(add(2, 3));
设置 importHelpers
为 true
,生成的 JavaScript 代码可能会包含一些额外的函数来处理模块导入,例如:
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule)? mod : { default: mod };
};
var _math = __importDefault(require('./math'));
console.log(_math.default.add(2, 3));
downlevelIteration
如果有以下 TypeScript 代码使用了迭代器:
function* numbers() {
yield 1;
yield 2;
yield 3;
}
for (const num of numbers()) {
console.log(num);
}
如果将目标 JavaScript 版本设置为 ES5 并且downlevelIteration
设置为true
,TypeScript 编译器会生成模拟迭代器的代码,以便在 ES5 环境中也能正确运行这段代码。
sourceRoot
undefined
。在默认情况下,调试器可能会尝试根据其他信息(如文件路径和源映射文件中的相对路径)来确定源文件的位置。项目结构如下:
my-project/
├── src/
│ ├── index.ts
│ ├── utils/
│ │ ├── helper.ts
│ │ └──...
│ └──...
├── dist/
│ ├── index.js
│ ├── utils/
│ │ ├── helper.js
│ │ └──...
│ └──...
├── tsconfig.json
└──...
在 tsconfig.json
中设置 sourceRoot
:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"sourceRoot": "src"
}
}
sourceRoot
设置为 "src"
,表示调试器在调试生成的 JavaScript 文件时,应该在项目的 src
目录中查找对应的 TypeScript 源文件。
mapRoot
.map
文件)的根目录。undefined
。在默认情况下,调试器可能会尝试根据其他信息(如文件路径和源映射文件中的相对路径)来确定源映射文件的位置。项目结构如下:
project
├── src
│ ├── file1.ts
│ ├── file2.ts
│ └──...
├── dist
│ ├── file1.js
│ ├── file1.js.map
│ ├── file2.js
│ ├── file2.js.map
│ └──...
├── tsconfig.json
└──...
在 tsconfig.json
中设置 mapRoot
:
{
"compilerOptions": {
"sourceMap": true,
"mapRoot": "mymaps"
}
}
在这个例子中,源映射文件放置在一个单独的目录mymaps
中进行管理,调试器将在 mymaps
目录中查找源映射文件。
inlineSources
false
。在默认情况下,TypeScript 编译器不会将原始的 TypeScript 源代码内联到生成的 JavaScript 文件中。emitBOM
false
。在默认情况下,TypeScript 编译器不会在生成的输出文件中包含字节顺序标记。newLine
"LF"
,即 Unix/Linux 风格的换行符。"CRLF"
:表示 Windows 风格的换行符,即回车符(\r
)和换行符(\n
)的组合。"LF"
:表示 Unix/Linux 风格的换行符,即换行符(\n
)。"CR"
:表示 Mac OS 9 及更早版本的换行符,即回车符(\r
)。stripInternal
false
。noEmitHelpers
false
。在默认情况下,TypeScript 编译器会生成辅助函数,以确保代码的正确编译和运行。true
,不会生成辅助函数。noEmitOnError
false
。在默认情况下,在编译过程中遇到错误,TypeScript 编译器仍然会生成输出文件。true
,在编译过程中遇到错误,编译器将不会生成输出文件。preserveConstEnums
false
。在默认情况下,TypeScript 编译器会在编译过程中对常量枚举进行优化,将其值直接替换为对应的常量表达式,不会保留枚举的定义。true
,常量枚举的定义将在编译后的 JavaScript 代码中保留。declarationDir
.d.ts
文件)的输出目录。undefined
。声明文件(.d.ts
)通常会输出到与对应的 .js
文件相同的目录中。true
,生成的声明文件(.d.ts
文件)会单独放在一个单独的目录中。isolatedModules
false
。在默认情况下,TypeScript 编译器不会将每个文件视为独立的模块进行编译。verbatimModuleSyntax
false
。在默认情况下,TypeScript 编译器会根据目标环境和其他配置选项对模块语法进行适当的转换和优化。true
,TypeScript 编译器会尽可能保留原始的模块语法,而不进行额外的转换或优化。isolatedDeclarations
.d.ts
)作为独立的文件进行编译。false
。在默认情况下,声明文件不是作为独立的编译单元进行处理。true
,明文件将被独立编译。allowSyntheticDefaultImports
false
。在默认情况下,TypeScript 不允许使用合成的默认导入。esModuleInterop
false
。在默认情况下,TypeScript 不会自动启用与旧的模块系统的互操作性。preserveSymlinks
false
。在默认情况下,TypeScript 编译器会在编译过程中解析符号链接,并将其转换为实际的文件路径。true
,TypeScript 编译器会保留符号链接所指向的原始文件结构。项目结构如下:
project/
├── src/
│ ├── module1.ts
│ └──...
├── node_modules/
│ ├── symlinked_module/
│ │ ├── module2.ts
│ │ └──...
│ └──...
├── tsconfig.json
└──...
如果设置 preserveSymlinks
为 true
,在编译过程中,符号链接 node_modules/symlinked_module
将被保留,编译器会将其视为实际的文件路径进行模块解析。
forceConsistentCasingInFileNames
false
。在默认情况下,TypeScript 编译器不会强制要求文件名的大小写一致。true
,在引用文件时,必须使用一致的文件名大小写。strict
所有严格模式的总开关。用于开启严格类型检查模式。
false
。在默认情况下,TypeScript 不会开启严格模式。true
,开启一系列严格的类型检查规则。TypeScript 编译器会在生成的 JavaScript 文件的开头添加 "use strict";
语句。"noImplicitAny"
:禁止隐式的 any
类型。在严格模式下,必须显式地指定变量的类型,否则会导致编译错误。"strictNullChecks"
:启用严格的空值检查。要求在代码中明确处理可能为 null
或 undefined
的值。"strictFunctionTypes"
:对函数类型进行更严格的检查。确保函数参数的类型和返回值的类型与调用者的期望一致。"strictBindCallApply"
:对 bind
、call
和 apply
的使用进行严格检查。"strictPropertyInitialization"
:要要求类的属性在构造函数中进行初始化,或者在属性声明时提供初始值。noImplicitAny
any
类型。false
。true
,TypeScript 编译器将不允许隐式地将变量类型推断为 any
。如果一个变量的类型没有被明确指定,并且无法从上下文推断出具体类型,编译器将报告错误。strictNullChecks
false
。true
,TypeScript 要求开发者明确指定变量是否可以为 null
或 undefined
。strictFunctionTypes
false
。TypeScript 在函数类型检查方面相对较为宽松。true
的影响:
strictBindCallApply
bind
、call
和 apply
方法的严格类型检查。false
。TypeScript 在对 bind
、call
和 apply
方法的类型检查相对较宽松。true
的影响:
true
时,TypeScript 会对传递给 bind
、call
和 apply
方法的参数进行更严格的类型检查。如果参数的类型与函数的期望类型不匹配,将会产生编译错误。bind
、call
和 apply
方法的返回值类型。示例:
function add(a: number, b: number): number {
return a + b;
}
const boundAdd = add.bind(null, 10);
// 不启用 strictBindCallApply
boundAdd(20); // 返回 30,不会产生编译错误
// 启用 strictBindCallApply
boundAdd(20);
// 如果 boundAdd 的调用参数类型与 add 函数不匹配,将会产生编译错误
当 strictBindCallApply
为 false
时,使用 bind
方法创建的函数 boundAdd
可以接受不同类型的参数而不会产生编译错误。
当 strictBindCallApply
为 true
时,参数的类型必须与原始函数 add
的期望类型匹配,否则会产生编译错误。
strictPropertyInitialization
false
。TypeScript 在属性初始化检查方面相对较宽松。true
的影响:
strictPropertyInitialization
为 true
,那么在构造函数中必须对这些属性进行初始化。否则,编译器会产生错误。?
表示可能为 null
或 undefined
。noImplicitThis
this
类型。false
。 在默认情况下,TypeScript 在函数类型检查方面相对较为宽松。true
,TypeScript 编译器将不允许在函数内部隐式地使用 this
。在函数内部添加更多的类型标注来明确 this
的类型。useUnknownInCatchVariables
catch
语句中捕获的错误变量的类型。false
。 在默认情况下,在 catch
语句中捕获的错误变量的类型是 any
,可以直接访问其属性和方法,不需要进行类型检查。true
的影响:
useUnknownInCatchVariables
后,在使用捕获的错误变量之前,必须进行类型检查或类型断言。例如,可以使用 if (error instanceof SomeErrorType)
或 (error as KnownErrorType)
来确定错误的类型,并进行相应的处理。alwaysStrict
false
。在默认情况下,不强制以严格模式编译代码。true
的影响:
with
语句、函数参数不能重名等。noUnusedLocals
false
。在默认情况下,不进行未使用局部变量的检查。true
的影响:
noUnusedParameters
false
。在默认情况下,不进行未使用参数的检查。true
的影响:
exactOptionalPropertyTypes
false
。在默认情况下,可选属性的类型可以是更宽泛的联合类型,包括 undefined
和实际的类型。true
的影响:
undefined
或实际的类型。noImplicitReturns
false
。在默认情况下,不进行隐式返回值的检查。true
,函数中存在没有返回值的代码路径,TypeScript 编译器会发出编译错误。noFallthroughCasesInSwitch
switch
语句中是否存在没有break
或return
等终止语句导致的“穿透”情况。false
。在默认情况下,不进行“穿透”情况的检查。true
,在switch
语句中存在没有终止语句导致的“穿透”情况,TypeScript 编译器会发出编译错误。noUncheckedIndexedAccess
false
。在默认情况下,不进行严格的索引访问检查。true
,代码中存在对可能未定义的索引进行访问的情况,TypeScript 编译器会发出编译错误。示例:
interface MyObject {
prop1: string;
prop2: number;
}
const myArray: MyObject[] = [
{ prop1: 'value1', prop2: 1 },
{ prop1: 'value2', prop2: 2 },
];
// 不启用 noUncheckedIndexedAccess
const value1 = myArray[2].prop1;
// 不会导致编译错误,但在运行时可能会出现 undefined 错误
// 启用 noUncheckedIndexedAccess
const value2 = myArray[2]?.prop1;
// 使用可选链操作符来处理可能未定义的情况,否则会导致编译错误
noImplicitOverride
false
。在默认情况下,允许在子类中隐式地重写父类方法。true
,在子类中重写父类方法时,必须使用override
关键字进行明确标识,否则会导致编译错误。示例:
class Parent {
method(): void {
console.log('Parent method');
}
}
class Child extends Parent {
// 不启用 noImplicitOverride
method(): void {
console.log('Child method');
}
// 启用 noImplicitOverride
override method(): void {
console.log('Child method with override');
}
}
noPropertyAccessFromIndexSignature
false
。在默认情况下,允许通过索引签名访问对象的属性。true
,不能通过索引签名访问已明确声明的属性。示例:
interface MyObject {
name: string;
[key: string]: string | number;
}
const obj: MyObject = {
name: 'John',
age: 30,
};
// 不启用 noPropertyAccessFromIndexSignature
console.log(obj['name']);
// 不会导致编译错误,但类型推断可能不太准确
// 启用 noPropertyAccessFromIndexSignature
console.log(obj.name);
// 正确的属性访问方式,否则会导致编译错误
allowUnusedLabels
false
。在默认情况下,不允许存在未使用的标签。如果代码中有未使用的标签,会导致编译错误。true
,未使用的标签不会导致编译错误。allowUnreachableCode
false
。在默认情况下,不允许存在不可达的代码。true
,允许在代码中存在理论上不可达的代码部分。不可达的代码不会导致编译错误。示例:
function exampleFunction(param: boolean) {
if (param) {
return "true case";
} else {
return "false case";
}
// 不启用 allowUnreachableCode
console.log("This code is unreachable");
// 会导致编译错误
// 启用 allowUnreachableCode
console.log("This code is unreachable but allowed");
// 不会导致编译错误
}
skipDefaultLibCheck
lib.d.ts
)的类型检查。false
。在默认情况下,会对默认库进行类型检查。true
,可以跳过对默认库的检查。示例:
// 不启用 skipDefaultLibCheck 会被编译器检查
let str: string = "Hello";
console.log(str.toUpperCase());
// 启用 skipDefaultLibCheck 不会检查
let num: number = 123;
console.log(num.toUpperCase());
// 不会导致编译错误,但在运行时会抛出错误,因为 number 类型没有 toUpperCase 方法
skipLibCheck
false
。在默认情况下,会对外部库进行类型检查。true
,可以跳过对外部库的类型检查。示例:
// 不启用 skipLibCheck,对外部库中的函数进行调用会进行类型检查。
import { someFunction } from 'external-library';
someFunction();
// 启用 skipLibCheck
import { someOtherFunction } from 'another-external-library';
someOtherFunction();
// 即使外部库中存在类型错误,也不会导致编译错误,但在运行时可能会出现问题
以上是学习时的粗浅了解,如果有描述或使用不正确的地方,请各位同学多多提醒~~~