今天我们来学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
安装完成后验证
node -v
npm -v
通过npm安装Typescript
npm install -g typescript
验证
tsc -v
#或者
tsc --version
以上命令会在全局环境下安装 tsc 命令,安装完成之后,我们就可以在任何地方执行 tsc 命令了
运行typescript代码
例如我们写一个hello.ts(和JavaScript一样,Typescript代码末尾的;号可加可不加,这里为了保持C#习惯我还是加吧)
const message: string = "Hello, World!";
console.log(message);
可以看到typescript在变量后使用:声明数据类型,比如我们当前的message就是Hello, World!即string字符串类型
当然也可以不写,因为typescript会自己推断
当然函数也是在参数括号右边声明类型
例如
typescript123function toString(num:number):string { return String(num); }
编译单个脚本
编译一个 TypeScript 文件很简单:
tsc hello.ts
我们约定使用 TypeScript 编写的文件以 .ts 为后缀,用 TypeScript 编写 React 时,以 .tsx 为后缀
然后就会发现在根目录生成了一个同名js文件,只是少了类型
"use strict";
const message = "Hello, World!";
console.log(message);
此时可以使用node hello.js运行js得到Hello, World!
node hello.js
由此我们可以发现typescript自己无法运行代码内容本身,而是先通过tsc编译器转换为JavaScript后使用nodejs运行
即typescript只在编译时检查类型,转换为JavaScript后就不管了
编译多个脚本
同样的tsc可以编译多个脚本
tsc hello.ts hello01.ts hello02.ts
编译完成会生成3个同名js文件即hello.js,hello01.js,hello02.js
tsc参数
其实就是tsc cli命令,详见typescript官方文档
或者在终端使用help命令查看所有tsc命令
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/exports | Node 项目改用 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 |
ignoreDeprecations | TS5/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 配置 |