【青训营】-原来TypeScript应该这样学👇(开发环境及预备知识)

简介: 【青训营】-原来TypeScript应该这样学👇(开发环境及预备知识)

前言


近几年前端对 TypeScript 的呼声越来越高,尤大大更是将Vue3用TypeScript重写了一遍, TypeScript 似乎也变成了一个必须要会的技能,不然你想看看Vue3源码都寸步难行,知乎上经常见到像『自从用了 TypeScript 之后,再也不想用 JavaScript 了』、『只要你用过 ES6,TypeScript 可以几乎无门槛接入』、『TypeScript可以在任何场景代替 JS』这些类似的回答,抱着听别人说不如和我一起来学习TypeScript吧,最近参加了第一届字节前端青训营,TypeScript学习也是从这开始,这篇文章是一篇学习笔记,如有记录错误欢迎大佬们指出~🧐


一、TypeScript基础


1.1 开发环境搭建


初始化第一个TypeScript项目


npm init -y 
npm install --save-dev typescript # 最新稳定版
npm install --save-dev typescript@next # 尝鲜版
复制代码


创建tsconfig.js文件


方法一:首先创建.ts文件,然后在VsCode的右下角点击TypeScript版本号,然后会出现下拉菜单,点击创建tsconfig选项,这样tsconfig文件就创建好啦~


edc3051997ad4708b08b7804e7ccafd1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


tsconfig.json文件如下👇:


{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2020",
    "jsx": "preserve",
    "strictFunctionTypes": true,
    "sourceMap": true
  },
  "exclude": [
    "node_modules",
    "**/node_modules/*"
  ]
}
复制代码


方法二:进入node_modules/.bin/tsc 然后运行命令--init locale zh-CN,这样也能生成tsconfig文件~


选择TypeScript版本


5e74b561725d45719c469a9e75bda3af_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


我们选择node_modules目录下的那个版本。


c6d16c3d538a4d6680aeb12f49085da3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


选择版本之后,根目录下会生成.vscode文件夹,里面会有settings.json文件。


71c47de00f4b4369bc17461c418c9874_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


1.2 工具


TS Playground


TypeScript官方为我们提供了测试ts代码的工具:TS Playground。如下图所示:👇


37955e6612364bb28f57c9c2b37c1a58_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Equal<x,y>


该工具可以查看两个类型名的类型是否相等。


1.3 预备知识


TS与JS的关系


05fca75b7b8843c2b60b843fbbe70fed_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.jpg


我们要清楚的是TypeScriptJavaScript的超集,TypeScript提供了所有JavaScript特性,并在其上层增加了TypeScript类型系统


这个类型系统被设计为”可选的“。这就意味着:所有合法的JavaScript代码都是合法的TypeScript代码.


TS的编译过程


‘TS的类型检查’与‘生成JS’是两个独立的过程;类型检查出错不影响生成JavaScript代码! 因此它和C,C++等语言的编译过程是不同的!


类型系统


我们要清楚 TS采用的是结构类型系统,那么什么是结构类型系统呢?


结构类型系统(Structural Type System) 通过类型的实际结构确定两个类型是否相等或兼容(TypeScript,Haskell,Go,...) 名义类型系统(Nominal Type System) 通过类型的名称确定两个类型是否相等(C,C++,Java,C#,Rust,...)


类型注解


TS的类型注解也是我们要知道的,它和其他语言有所不同,看下面代码:👇


// C++ 放在前面
int printf( const char*, ...);
// Objc 放在前面,加括号
- (id)initWithInt:(int)value;
// Julia 放在后面,加双冒号
commission(sale::Int,rate::Float64)::Float64
// TypeScript 也放在后面,加双冒号
function log(message: string): void
复制代码


类型与集合的关系


具体看见下表


TypeScript term Set term
nerver empty set
Lieral type Single element set
Value assignable toT Value∈T(member of)
T1 assignable to 2 T1⊆T2(subset of)
T1 extends T2 T1⊆T2(subset of)
T1|T2 T1∪T2
T1&T2 T1∩T2(intersection)
unknown Universal set


类型别名


在JS中:可以勇let、const、var声明变量或常量

在TS中:可以勇type为类型声明别名

类型别名和let变量类似,也采用块级作用域。所以,同一作用域内不能重名。


类型拓宽与收窄


类型拓宽(Type Widening):


当你把用字面量赋值给let、var变量使,TS不用字面量类型作为该变量的类型。而是从字面量类型拓宽到相应的更宽泛的类型。这个过程叫做类型拓宽


类型收窄(Type Narrowing):


在某些情况下,TS可以更加确定变量的类型,此时它将会将变量类型收窄。


TS试图在类型确定性与灵活性之前取得平衡。 TS提供一系列方法来帮助收窄类型,以提高类型的确定性:


  • null check
  • ad const
  • instanceof
  • typeof
  • 属性检查
  • Tagged Union
  • 用户类型守卫
  • 代码流


用let var声明变量时,TS认为变量未来会发生改变,所以将类型推断为相应宽泛的类型。 用const声明变量时,TS知道常量是不会改变的,会将类型推断为最窄的字面量类型。


值类型与类型空间


b0363aaf8da149d8a2e3b6ef4b6b630d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


我们可以这样理解,所谓的类型空间就是编译期存在的各种类型,它是由TypeScript的编译器里面的tsc创建的,值空间是由JS引擎比如V8引擎创建的,里面存在运行时的各种值。


只包含类型声明的namespace不会产生JS代码,不会引入变量。


instanceof操作符只作用于值空间。


如何判断符号在哪个空间呢?


  1. 转译后消失的代码——>类型空间
  2. 作为类型注解、别名的符号——>类型空间
  3. 类型断言后的符号——>类型空间(target as/is HTMLElement)
  4. const,let,var后面的符号——>值空间
  5. class,enum,namespace后的符号——>值空间+类型空间


TS中的类型层次


可见下图👇:


641943961ff841ff917cece1cacc1333_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


下层类型的值可以赋给上层类型的变量/常量

unknown类型的变/常量可以指向任何类型的值

不存在never类型的变量(nerver是空集)


对比不同语言的 Top Type和 Bottom Type

822fce3ca3a64c1284031749d4b911e2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


好啦,到这,我们学习TypeScript的预备知识就介绍完啦~


最后


⚽好啦,到这,我们学习TypeScript的预备知识就介绍完啦~

⚾后面会更新TypeScript的基础知识噢!感兴趣的同学可以点赞关注+收藏,更多精彩知识正在等你~

相关文章
|
6月前
|
JavaScript 前端开发 IDE
如何安装 TypeScript,并配置开发环境以便开始使用
如何安装 TypeScript,并配置开发环境以便开始使用
107 0
|
JavaScript 安全
【青训营】- TypeScript进阶笔记
【青训营】- TypeScript进阶笔记
123 0
|
JavaScript 前端开发
【青训营】- TypeScript入门笔记
【青训营】- TypeScript入门笔记
119 0
|
2月前
|
JavaScript
typeScript进阶(9)_type类型别名
本文介绍了TypeScript中类型别名的概念和用法。类型别名使用`type`关键字定义,可以为现有类型起一个新的名字,使代码更加清晰易懂。文章通过具体示例展示了如何定义类型别名以及如何在函数中使用类型别名。
41 1
typeScript进阶(9)_type类型别名
|
1月前
|
JavaScript 前端开发 安全
深入理解TypeScript:增强JavaScript的类型安全性
【10月更文挑战第8天】深入理解TypeScript:增强JavaScript的类型安全性
48 0
|
1月前
|
JavaScript 前端开发 开发者
深入理解TypeScript:类型系统与实用技巧
【10月更文挑战第8天】深入理解TypeScript:类型系统与实用技巧
|
2月前
|
存储 JavaScript
typeScript进阶(11)_元组类型
本文介绍了TypeScript中的元组(Tuple)类型,它是一种特殊的数组类型,可以存储不同类型的元素。文章通过示例展示了如何声明元组类型以及如何给元组赋值。元组类型在定义时需要指定数组中每一项的类型,且在赋值时必须满足这些类型约束。此外,还探讨了如何给元组类型添加额外的元素,这些元素必须符合元组类型中定义的类型联合。
48 0
|
2月前
|
JavaScript
typeScript进阶(10)_字符串字面量类型
本文介绍了TypeScript中的字符串字面量类型,这种类型用来限制变量只能是某些特定的字符串字面量。通过使用`type`关键字声明,可以确保变量的值限定在预定义的字符串字面量集合中。文章通过示例代码展示了如何声明和使用字符串字面量类型,并说明了它在函数默认参数中的应用。
37 0
|
11天前
|
JavaScript 安全 前端开发
TypeScript类型声明:基础与进阶
通过本文的介绍,我们详细探讨了TypeScript的基础与进阶类型声明。从基本数据类型到复杂的泛型和高级类型,TypeScript提供了丰富的工具来确保代码的类型安全和可维护性。掌握这些类型声明能够帮助开发者编写更加健壮和高效的代码,提高开发效率和代码质量。希望本文能为您在使用TypeScript时提供实用的参考和指导。
23 2
|
24天前
|
JavaScript 开发者
在 Babel 插件中使用 TypeScript 类型
【10月更文挑战第23天】可以在 Babel 插件中更有效地使用 TypeScript 类型,提高插件的开发效率和质量,减少潜在的类型错误。同时,也有助于提升代码的可理解性和可维护性,使插件的功能更易于扩展和升级。
下一篇
无影云桌面