深入浅出 Typescript
TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程)。
TypeScript 由微软开发的自由和开源的编程语言。
TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上。
1 TypeScript VS JavaScript

| TypeScript | JavaScript |
|---|---|
| JavaScript 的超集,用于解决大型项目的代码复杂性 | 一种脚本语言,用于创建动态网页 |
| 强类型,支持静态和动态类型 | 动态弱类型语言 |
| 可以在编译期间发现并纠正错误 | 只能在运行时发现错误 |
| 不允许改变变量的数据类型 | 变量可以被赋值成不同类型 |
2 TypeScript基础
2.1 TS基础-基础类型
- boolean、number、string
- undefined、null
- any、unknown、void
- never
- 数组类型 []
- 元组类型 tuple
// 举个例子
function test(x:string | number):boolean {
if (typeof x === 'string') {
return true;
} else if (typeof x === 'number') {
return false;
}
return throwError('参数格式不对');
}
function throwError(message:string):never {
throw new Error(message);
}
2.2 TS基础-函数类型
定义:TS定义函数类型时要定义输入参数类型和输出类型
输入参数:参数支持可选参数和默认参数
输出参数:输出可以自动推断,没有返回值时,默认为 void 类型
函数重载:名称相同但参数不同,可以通过重载支持多种类型
function add(x:number[]):number
function add(x:string[]):string
function add(x:any[]):any {
if (typeof x[0] === 'string') {
return x.join()
}
if (typeof x[0] === 'number') {
return x.reduce((acc,cur) => acc + cur)
}
}
2.3 TS基础-interface
定义:接口是为了定义对象类型
特点:
- 可选属性:?
- 只读属性:readonly
- 可以描述函数类型
- 可以描述自定义属性
总结:接口非常灵活duck typing
interface RandomKey {
[propName:string]:string
}
const obj:RandomKey = {
a:'hello',
b:'world',
c:'typescript',
}
2.4 TS基础-类
定义:写法和JS差不多,增加了一些定义
特点:
- 增加了 public、private、protected 修饰符
- 抽象类:
- 只能被继承,不能被实例化
- 作为基类,抽象方法必须被子类实现
- interface:约束类,使用implements关键字
3 TypeScript 进阶
3.1 TS进阶-高级类型
- 联合类型 |
- 交叉类型 &
- 类型断言
- 类型别名(type VS interface)
- 定义:给类型起个别名
- 相同点:
- 都可以定义对象或函数
- 都允许继承
- 差异性
- interface是TS用来定义对象,type是用来定义别名方便使用;
- type可以定义基本类型,interface:不行;
- interface可以合并重复声明,type不行;
3.2 TS进阶-泛型-什么时候需要泛型?
官方定义:
软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。
组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
在像 C# 和 Java 这样的语言中,可以使用泛型来创建可重用的组件,
一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。
有点晦涩,还是举个栗子。
3.3 TS进阶-泛型-什么时候需要泛型?

3.4 TS进阶-泛型-基本使用
基本定义:
- 泛型的语法是◇里面写类型参数,一般用T表示;
- 使用时有两种方法指定类型:
- 定义要使用的类型
- 通过TS类型推断,自动推导类型
- 泛型的作用是临时占位,之后通过传来的类型进行推导;
function print<T>(arg:T):T {
console.lLog(arg)
return arg
}
print<string>('hello') // 定义T为string
print('hello') // TS类型推断,自动推导类型为string
3.5 TS进阶-泛型工具类型-基础操作符

3.6 TS进阶-泛型工具类型-常用工具类型
- Partials:将类型属性变为可选
- Required:将类型属性变为必选
- Readonly.:将类型属性变为只读
- Pick、Record...
type Partials<T> ={
[P in keyof T]?:T[P];
};
type Required<T> = {
[P in keyof T]-?:T[P]
};
type Readonly<T> = {
readonly [P in keyof T]:T[P];
};
4 TypeScript 实战
4.1 TS实战-声明文件
- declare:三方库需要类型声明文件
- .dts:声明文件定义
- @types:三方库TS类型包
- tsconfig.json:定义TS的配置
4.2 TS实战-泛型约束后端接口类型

深入浅出 Typescript的更多相关文章
- 深入浅出TypeScript(1)
前言 在学习TypeScript过程中,我也是遇到了很多的阻力,因为并未有太多深入挖掘的场景,之前做IONIC的时候,也只是用TS,现如今,这一个系列也是记录自己学习和收获,同时希望自己的这系列教程对 ...
- 深入浅出TypeScript(2)- 用TypeScript创建web项目
前言 在第一篇中,我们简单介绍了TypeScript的一些简单语法,那么如果我们只是简单使用TypeScript开发一个web项目,应该做哪些准备?接下来我们就结合TypeScript和Webpack ...
- 深入浅出TypeScript(3)- 函数重载和泛型
面向对象特性中,最根本的就是面向对象的三大基本特征:封装.继承.多态.同时,TypeScript中也存在多态的使用,比如函数重载,今天我们先看一下函数重载以及泛型的概念. 什么是函数重载 简单来说,函 ...
- 深入浅出TypeScript(4)- 使用接口和类型别名
在TypeScript中,为了可以约束对象定义,提供了两个新的特性,接口和类型别名. TypeScript中的接口 在强类型语言中,都有接口的概念,那么TypeScript中的接口是如何使用的呢? 接 ...
- 深入浅出TypeScript(5)- 在React项目中使用TypeScript
前言 在第二小节中,我们讨论了利用TypeScript创建Web项目的实现,在本下节,我们讨论一下如何结合React创建一个具备TypeScript类型的应用项目. 准备 Webpack配置在第二小节 ...
- 深入浅出 Typescript 学习笔记
TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准. TypeScript 由微软开发的自由和开源的编程语言. TypeScript 设计目标是开发大型应 ...
- 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1
[ASP.NET Core]EF Core - “影子属性” 有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...
- NodeJs中require use get typescript及其他知识点集合
NodeJs的Express使用 nodejs事件的监听与事件的触发 TypeScript学习笔记 深入浅出Node.js Nodejs开发Office插件 类百度文库文档上传.转换和展示功能项目开源 ...
- 深入浅出 Webpack
深入浅出 Webpack 评价 Webpack 凭借强大的功能与良好的使用体验,已经成为目前最流行,社区最活跃的打包工具,是现代 Web 开发必须掌握的技能之一.作者结合自身的实战经验,介绍了 Web ...
- JavaScript深入浅出第4课:V8引擎是如何工作的?
摘要: 性能彪悍的V8引擎. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等 ...
随机推荐
- Linux修改系统时间(手动/自动同步)
一.手动修改 1.在终端窗口中输入date来查看系统当前的时间. 2.使用命令:"date -s 完整日期时间(YYYY-MM-DD hh:mm:ss)" 3.最后使用命令:&qu ...
- 2023-01-07:hyper/docker-registry-web是registry的web界面工具之一。请问部署在k3s中,yaml如何写?
2023-01-07:hyper/docker-registry-web是registry的web界面工具之一.请问部署在k3s中,yaml如何写? 答案2023-01-07: yaml如下: api ...
- 2022-09-14:以下go语言代码输出什么?A:0 0;B:0 1;C:1 1;D:1 0。 package main func main() { println(f(1)) } func
2022-09-14:以下go语言代码输出什么?A:0 0:B:0 1:C:1 1:D:1 0. package main func main() { println(f(1)) } func f(x ...
- 2021-12-04:公交路线。给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。 例如,路线 routes[0]
2021-12-04:公交路线.给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶. 例如,路线 routes[0] ...
- 手机app解包
1.将在网上下载的手机软件放入apps 2.启动 3.查看结果 urls里是网址
- PHP编程与系统开发
PHP开发环境配置 一.开发环境 1.XAMPP或LNMP.WNMP,先安装widows版本的XMAPP-5.6版本(PHP 5.6) 2.VSCode:微软开发的集成开发环境(IDE) 二.安装教程 ...
- 2019年蓝桥杯C/C++大学B组省赛真题(迷宫)
题目描述: 下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为左上角,出口为右下角,在迷宫中,只 ...
- vue+iview 动态调整Table的列顺序
需求:因table列太多,且每个部门关注的信息不一样,拖来拖去不方便观看,客户想让Table列可以拖动,且可以保存顺序. 但是搞动态拖动太难了,我不会,于是改为操作columns数据 思路: < ...
- aspnetcore最最简单的接口权限认证
五月一眨眼就过去,就当凑个数吧. 场景: 一个小小的项目,需要一个后台,就展示几个列表,连用户表.角色表等都不需要设计. 之前有写过identityserver4和jwt4的demo (exercis ...
- 曲线艺术编程 coding curves 第四章 利萨茹曲线(Lissajous Curves)
第四章 利萨茹曲线(Lissajous Curves) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池 ...