今天我们来学Typescript

学习资料来源

https://ts.xcatliu.com/introduction/what-is-typescript.html

https://wangdoc.com/typescript/intro

https://www.runoob.com/typescript/ts-install.html

https://www.typescriptlang.org/zh/docs/handbook/tsconfig-json.html

官方定义

*TypeScript*(简称 TS)是由微软开发并开源的编程语言,它是 JavaScript 的一个超集,为代码添加了可选的静态类型检查

核心特点

  • JavaScript 的超集:所有合法的 JavaScript 代码都已经是合法的 TypeScript 代码
  • 静态类型检查:在代码运行之前(编译阶段),就能帮你发现拼写错误、类型不匹配等问题
  • 最终编译为 JS:浏览器和 Node.js 无法直接运行 TS 代码,它需要通过编译器(tsc)转译成纯 JavaScript 后再执行
  • 完全兼容:100% 兼容现有的 JavaScript 生态和库

为什么使用 TypeScript?

  • 提前报错:不用等到代码运行或上线,在编辑器(如 VS Code)里写代码时就能实时看到错误提示
  • 大型项目友好:面对复杂的代码库,类型定义让代码结构更清晰,重构和维护更安全
  • 智能提示:编辑器能根据类型准确提示对象的属性和函数的参数,提高开发效率

安装Typescript

再开始前确保已经安装nodejs

安装完成后验证

powershell
12
node -v
npm -v

通过npm安装Typescript

powershell
1
npm install -g typescript

验证

powershell
123
tsc -v
#或者
tsc --version

以上命令会在全局环境下安装 tsc 命令,安装完成之后,我们就可以在任何地方执行 tsc 命令了

运行typescript代码

例如我们写一个hello.ts(和JavaScript一样,Typescript代码末尾的;号可加可不加,这里为了保持C#习惯我还是加吧)

typescript
12
const message: string = "Hello, World!";
console.log(message);

可以看到typescript在变量后使用:声明数据类型,比如我们当前的message就是Hello, World!即string字符串类型

当然也可以不写,因为typescript会自己推断

当然函数也是在参数括号右边声明类型

例如

typescript
123
function toString(num:number):string {
  return String(num);
}

编译单个脚本

编译一个 TypeScript 文件很简单:

bash
1
tsc hello.ts

我们约定使用 TypeScript 编写的文件以 .ts 为后缀,用 TypeScript 编写 React 时,以 .tsx 为后缀

然后就会发现在根目录生成了一个同名js文件,只是少了类型

javascript
123
"use strict";
const message = "Hello, World!";
console.log(message);

此时可以使用node hello.js运行js得到Hello, World!

powershell
1
node hello.js

由此我们可以发现typescript自己无法运行代码内容本身,而是先通过tsc编译器转换为JavaScript后使用nodejs运行

即typescript只在编译时检查类型,转换为JavaScript后就不管了

编译多个脚本

同样的tsc可以编译多个脚本

powershell
1
tsc hello.ts hello01.ts hello02.ts

编译完成会生成3个同名js文件即hello.js,hello01.js,hello02.js

tsc参数

其实就是tsc cli命令,详见typescript官方文档

或者在终端使用help命令查看所有tsc命令

powershell
123
tsc --help
#或者
tsc -h

其中有部分命令在我们tsc 7.0.2版本已被移除

已移除选项功能说明推荐迁移方案
target: "es5" (及 es3)编译输出 ES5 代码,用于兼容 IE 等老旧浏览器升级 target 至 es2015 或更高;若仍需 ES5 产物,需配合 Babel/esbuild 二次转译
outFile (及旧别名 --out)TS 内置的多文件拼接单输出改用 Webpack/Vite/esbuild/Rollup 等专业打包工具
moduleResolution: "node" / "node10"旧版 Node 模块解析逻辑,不兼容新版 ESM/exportsNode 项目改用 nodenext;打包/Vite/Bun 项目改用 bundler
moduleResolution: "classic"TypeScript 初代模块解析算法,无现代使用场景统一改用 nodenext 或 bundler
module: "amd" / "umd" / "systemjs" / "none"老式浏览器模块化方案改用 esnext,输出格式由打包工具处理
baseUrl路径映射的根目录,易产生意外模块匹配将所有 paths 路径改为相对于项目根目录的完整前缀
downlevelIteration仅为 ES5 提供迭代器垫片,无 ES5 时无作用直接删除,ES2015+ 原生支持迭代
esModuleInterop: false关闭 ESM 与 CommonJS 互兼容逻辑强制永久为 true,不可关闭。需修正导入写法
allowSyntheticDefaultImports: false禁止合成默认导入强制永久为 true,不可关闭。统一标准导入语法
alwaysStrict: false关闭 JS 严格模式解析强制永久为 true,不可关闭。需重命名 await/static/private 等保留字变量
importsNotUsedAsValues / preserveValueImports控制类型导入的保留行为改用 "verbatimModuleSyntax": true
ignoreDeprecationsTS5/6 中用于屏蔽废弃警告的“逃生舱”彻底移除,所有废弃选项在 7.0 中均变为硬错误
charset指定源文件字符集(已无实际作用)直接删除,编译器默认使用 UTF-8
keyofStringsOnly控制 keyof 仅返回字符串键直接删除,使用 keyof T & string 替代
noImplicitUseStrict控制是否自动添加 "use strict"直接删除,严格模式已由 strict 统一管理
suppressExcessPropertyErrors抑制对象字面量的多余属性检查直接删除,推荐使用 --exactOptionalPropertyTypes
suppressImplicitAnyIndexErrors抑制隐式 any 索引错误直接删除,开启 strict 后由类型系统统一处理
noStrictGenericChecks关闭泛型严格检查直接删除
prepend: true (项目引用)在项目引用中前置输出彻底移除,输出前置功能自 TS6 起已消失
/// <reference no-default-lib="true"/>控制内置标准库加载的三斜杠指令指令失效,改用 --noLib / libReplacement 配置