You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
classRectangle{width: number;height: number;constructor(width: number,height: number){this.width=width;this.height=height;}getAreaFunction(){returnfunction(){returnthis.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.};}}
示例
tsc --init
创建tsconfig.json
,对所有选项添加注释说明👇:顶级属性
extends
继承配置。
比如:
./tsconfig.json
文件内容:继承规则:
tsconfig.json
)中的配置首先加载,然后被继承配置文件(tsconfig.base.json
)中的配置覆盖。tsconfig.base.json
)中的files
、include
和exclude
覆盖了基础配置文件(tsconfig.json
)中的files
、include
和exclude
。references
属性不可被继承。include
指定需要编译的文件或模式数组。这些文件名是相对于包含
tsconfig.json
文件的目录解析的。将包括:
include
和 exclude 都支持 glob 模式:*
匹配零个或多个字符(不包括目录分隔符)?
匹配任何一个字符(不包括目录分隔符)**/
匹配嵌套到任何级别的任何目录如果 glob 模式不包含文件扩展名,则只包含支持扩展名的文件(例如默认情况下为
.ts
,.tsx
和.d.ts
, 如果allowJs
设置为true
,还将包含.js
和.jsx
)。编译选项(compilerOptions)。
lib
TypeScript 包括一组默认的内建 JS 接口(例如
Math
)的类型定义,以及在浏览器环境中存在的对象的类型定义(例如document
)。 TypeScript 还包括与你指定的target
选项相匹配的较新的 JS 特性的 API。例如如果target
为ES6
或更新的环境,那么Map
的类型定义是可用的。ES5
:ES3 和 ES5 的核心功能定义ES2015
:ES2015 中额外提供的 API (又被称为 ES6) —— array.find, Promise,Proxy,Symbol,Map,Set,Reflect 等。ES6
:ES2015 的别名。ES2016
:ES2016 中额外提供的 API —— array.include 等。ES7
:ES2016 的别名。ES2017
:ES2017 中额外提供的 API —— Object.entries,Object.values,Atomics,SharedArrayBuffer,date.formatToParts,typed arrays 等。ES2018
:ES2018 中额外提供的 API —— async iterables,promise.finally,Intl.PluralRules,rexexp.groups 等。ES2019
:ES2019 中额外提供的 API —— array.flat,array.flatMap,Object.fromEntries,string.trimStart,string.trimEnd 等。ES2020
:ES2020 中额外提供的 API —— string.matchAll 等。ESNext
:ESNext 中额外提供的 API —— 随着 JavaScript 的发展,这些会发生变化。DOM
:DOM 定义 —— window,document 等。WebWorker
:WebWorker 上下文中存在的 API。ScriptHost
:Windows Script Hosting System 的 API。jsx
控制 JSX 在 JavaScript 文件中的输出方式。 这只影响 .tsx 文件的 JS 文件输出。
react
: 将JSX
改为等价的对React.createElement
的调用并生成.js
文件。react-jsx
: 改为__jsx
调用并生成.js
文件。react-jsxdev
: 改为__jsx
调用并生成.js
文件。preserve
: 不对JSX
进行改变并生成.jsx
文件。react-native
: 不对JSX
进行改变并生成.js
文件。declaration
为你工程中的每个
TypeScript
或JavaScript
文件生成.d.ts
文件。 这些.d.ts
文件是描述模块外部 API 的类型定义文件。当
declaration
设置为true
时,用编译器执行下面的TypeScript
代码:对应的
helloWorld.d.ts
:composite
引用的工程的
tsconfig.json
中必须启用composite
设置。 这个选项用于帮助 TypeScript 快速确定引用工程的输出文件位置。引用工程简单来说类似于一个大项目被分成多个小项目(引用工程),使得这些项目独立配置和构建。因此每个引用工程拥有独立的
tsconfig.json
文件来管理输出目录和其他选项,每个tsconfig.json
中增加了一个新的顶层属性references
,它是一个对象的数组,指明该项目要使用到的其他项目(引用的工程),以下面功能为例:我们期望将
src
下面的文件直接被编译到 dist 目录,但__test__
除外,且client
、server
目录可以独立构建。完成以上配置后,已经实现了输出目录调整,而独立构建则可以使用 TypeScript 构建模式
--build
(增量构建),启用--build
后会自动地构建依赖项:# 单独构建 server 工程, -b 是 --build 的简写 tsc -b src/server --verbose
tsc -b
还支持其它一些选项:--verbose
:打印详细的日志(可以与其它标记一起使用)--dry
: 显示将要执行的操作但是并不真正进行这些操作--clean
: 删除指定工程的输出(可以与--dry
一起使用)--force
: 把所有工程当作非最新版本对待--watch
: 观察模式(可以与--verbose
一起使用)若启用
composite
标记则会发生如下变动:rootDir
设置,如果没有被显式指定,默认为包含tsconfig
文件的目录include
模式或在files
数组里列出。如果违反了这个限制tsc
会提示你哪些文件未指定。declaration
选项。总结工程引用的优点:解决了输出目录的结构问题;解决了单个工程的构建问题;通过增量编译提高了编译效率。
downlevelIteration
开启迭代器降级。当转换为旧版本的 JavaScript(ES5 或 ES3)时可以更准确的模拟 ES6 迭代器的行为。
ECMAScript 6 增加了几个新的迭代器语法:
for / of
循环(for (el of arr)
),数组展开([a, ...b]
),参数展开(fn(...args)
)和Symbol.iterator
。传统实现在不通常的场景下是符合期望的,但并不是 100% 符合 ECMAScript 迭代器协议。以
for / of
循环为例,未开启downlevelIteration
时,for / of
将被降级为传统的for
循环,些字符串,例如 emoji (😜),其.length
为 2(甚至更多),但在for-of
循环中应该只有一次迭代。再以数组展开([a, ...b]
)为例,数组中存在空元素时传统降级(使用concat
)带来的结果差异。更多代码示例。
你也可以通过
importHelpers
来使用tslib
以减少被内联的辅助函数的数量,详见👇。importHelpers
对于某些降级行为(转换到旧版本的 JavaScript),TypeScript 使用一些辅助代码来进行实现。例如继承类、展开数组或对象,以及异步操作。 默认情况下,这些辅助代码被插入到使用它们的文件中,如果在许多不同的模块中使用相同的辅助代码,则可能会导致代码重复。
如果启用了 importHelpers 选项,这些辅助函数将从 tslib 中被导入。
以如下 TypeScript 代码为例:
开启
downlevelIteration
(迭代器降级) 并且importHelpers
仍为 false:同时开启
downlevelIteration
和importHelpers
,辅助代码从tslib
导入:noImplicitThis
对隐含 any 类型的 this 表达式将生成错误。
noUncheckedIndexedAccess
在
索引签名
的结果中包含undefined
。TypeScript 中可通过索引签名(如
[propName: string]: string;
)来描述对象上未知键名但值类型已知的对象:开启
noUncheckedIndexedAccess
后,向类型中任何未声明的字段添加undefined
:如果需要访问那个属性,你可以先检查属性是否存在或者使用非空断言运算符(!后缀字符)。
baseUrl
设置解析非绝对路径模块名时的基准目录。通常用于你不想使用含有
../
或./
的路径来导入文件,或不希望在移动文件时需要更改路径。你可以定义一个根目录,以进行绝对路径文件解析,例如:
在这个项目中被配置为
"baseUrl": "./"
,TypeScript 将会从首先寻找与tsconfig.json
处于相同目录的文件。rootDirs
根目录。告诉编译器有许多“虚拟”的目录作为一个根目录,这将会允许编译器在这些“虚拟”目录中解析相对应的模块导入,就像它们被合并到同一目录中一样。
例如将
"src/views"
和"generated/templates/views"
设置为虚拟根目录:则:
allowSyntheticDefaultImports
当模块没有显式指定默认导出时,你需要这样导入:
import * as React from "react";
。allowSyntheticDefaultImports
为true
时,可以让你这样写导入:import React from "react";
。示例:
import utils from "./utilFunctions"
这段代码会引发一个错误,因为没有default
对象可以导入。 为了使用方便,Babel
这样的转译器会在没有默认导出时自动为其创建,使模块看起来更像:本选项不会影响 TypeScript 生成的 JavaScript,它仅对类型检查起作用,当你使用
Babel
生成额外的默认导出,从而使模块的默认导出更易用时,本选项可以让 TypeScript 的行为与 Babel 一致。esModuleInterop
TypeScript 像 ES6 模块一样对待 CommonJS/AMD/UMD,以下的行为有两个被证实的缺陷:
import * as moment from "moment"
这样的命名空间导入等价于const moment = require("moment")
import moment from "moment"
这样的默认导入等价于const moment = require("moment").default
这种错误的行为导致了这两个问题:
(import * as x)
只能是一个对象。TypeScript 把它处理成= require("x")
的行为允许把导入当作一个可调用的函数,这样不符合规范。开启
esModuleInterop
选项将会修复 TypeScript 转译中的这两个问题。第一个问题通过改变编译器的行为来修复,第二个问题则由两个新的工具函数来解决。具体实现请查看tsconfig#esModuleInterop
参考
The text was updated successfully, but these errors were encountered: