深入浅出TypeScript(1)
前言
在学习TypeScript过程中,我也是遇到了很多的阻力,因为并未有太多深入挖掘的场景,之前做IONIC的时候,也只是用TS,现如今,这一个系列也是记录自己学习和收获,同时希望自己的这系列教程对想要学习TypeScript的同学有一定的帮助,我尽量以简洁的语言以及代码来将我的东西阐述清楚。
如果,在文章中有错误和疏漏,希望大家多多指出和包涵,大家可以通过邮箱来联系我:869345843@qq.com
什么是TypeScript
关于TypeScript有一种很有趣的说法,说TypeScript = Typed + JavaScript,仔细想来,确切的说TypeScript应该是对JavaScript的扩展 + 类型系统,所以这个公式应该是Typed + JavaScript + Extends
而官方文档也说明了一件事情,那就是TypeScript是JavaScript的超集,为了让我们可以无缝从JavaScript切换到TypeScript,微软的TypeScript只是提供了TypeScript到JavaScript的编译,并不包含运行时,它的运行时也就是JavaScript的运行时,所以TypeScript可以说是一种JavaScript的新的编码实现。
TypeScript和JavaScript的类型
先让我们来看一下JavaScript的基本类型系统:Boolean、Null、Undefined、String、Number,以及ES6之后,新增的Symbol类型。
TypeScript有哪些类型呢?下面让我们来看一下TypeScript的基本类型:Boolean、Null、Undefined、String、Number、Symbol + TypeScript扩展的类型。
上方TypeScript的基本类型正是JavaScript的基础类型 + 自行扩展的类型系统。
TypeScript对于JavaScript的扩展类型借鉴了强类型语言的类型系统,有Void、Never、泛型等以及高阶类型。
TypeScript的表达形式
明确了TypeScript和JavaScript类型方面的差异化,我们来看看如何将JavaScript改写成为TypeScript呢?
先上一段JavaScript代码:
let str = 'Hello JavaScript'
let num = 10
let arr = [1, 2, 3]
const htmlStr = `${str}_${num}_${arr.join()}` document.querySelectorAll('.app')[0].innerHTML = str
对于上述一段代码,如果运行在TypeScript环境下,也是可以正常运行,因为TypeScript是JavaScript的超集,兼容这种写法。
那么,上面的代码,对应TypeScript又是如何的呢?下面我们用代码描述:
let str: string = 'Hello JavaScript'
let num: number = 10
let arr[] = [1, 2, 3] //Array<number>
const htmlStr = `${str}_${num}_${arr.join()}` document.querySelectorAll('.app')[0].innerHTML = str
由此可见,TypeScript是更规范化的将变量类型声明化,他的格式如下:
let variable: Type = value
TypeScript中的数据类型
说道TypeScript的数据类型,我们就可以用一段代码来展示:
// 原始类型
let bool: boolean = true
let num: number = 13
let str: string = 'abc' // 数组
let arr1: number[] = [1, 2, 3]
let arr2: Array<number> = [1, 2, 3]
let arr3: Array<number | string> = [1, '2'] // 元组
let tuple: [number, string] = [0, '2'] // 特殊数组,限定数组元组类型和个数
tuple.push(2) // [0 , '2', 2]
// tuple[2] //不允许越界访问 // 函数
let add = (x: number, y: number): number => x + y
let func: (x: number, y: number) => number
func = (a, b) => a + b //对象
let obj: object = { x: 1, y: 2 }
// obj.x = 100 // wrong
let obj2: { x:number, y:number } = { x: 1, y: 2 }
obj2.x = 100 //void
let noReturn = () => {}
void 0 === undefined // any
let x // 可以任意赋值 // never 永远不会有返回值
let error = () => {
throw new Error()
} // 枚举
enum Role { // 数字 或者声明字符串
Teacher, // 默认0开始以下依次+1
Student, // 1
}
TypeScript的类型推断
当然,我们在书写代码的过程中,如果忘记加类型,写出纯JavaScript代码,那么TypeScript也会通过类型推断,帮助我们推断出大部分类型。
比如我们最初的JavaScript代码,类型推断依照代码做出如下说明:
let str = 'Hello JavaScript'
str = 100 // error因为赋值操作,已经将str推断为string类型,这样赋值在TypeScript会报错 let num = 10
num = 'some string' // error,此时num已经推断为number类型,不可以将string类型赋值给它 let arr = [1, 2, 3]
arr = true // error, 类型推断为数组类型Array<number>,不能赋值Boolen
arr = ['1', '2', '3'] // error,类型推断为Array<number>,不能赋值为Array<string>类型 const htmlStr = `${str}_${num}_${arr.join()}` document.querySelectorAll('.app')[0].innerHTML = str
为什么要有类型
由上面代码可以知道,TypeScript对代码进行了比较严格的类型判断,那么我们肯定想问,为什么要这样做?
其实,这样做最大的好处,就可以让代码简单的文档化,并且规范我们的代码操作,避免一些不必要的边界值问题,这对于开发大型应用和写测试用例都有极大的帮助。
而TypeScript却也并未限制我们编码的自由,就像是骑马,如果单纯用JavaScript书写代码,就好像是没有缰绳的骑马,会让我们陷入到危险和抓狂之中,但是有了TypeScript,我们就相当于是有了缰绳,可以使得我们的代码更优雅,也更容易控制和理解。
总结
本篇文章探讨了TypeScript和JavaScript中的类型系统,以及在TypeScript中如何处理类型声明和赋值。同时也暴露了一些灵活性的问题,比如不能将一个字符串数组赋值给数字数组。所以我们如果单一的想要定义一个多类型的数组就会遇到麻烦,但这些不是问题,TypeScript中也存在着解决方案。
在下一篇,我们将会看看TypeScript是如何处理这些要求,以及如何给予相应的类型限制和定义的。
参考资料:
TypeScript手册:TypeScript
极客时间TypeScript开发实战专栏:TypeScript开发实战
参考书:TypeScript实战指南
参考书:Leaning TypeScript中文版(这本书讲解的TypeScript的版本为1.5+,不是最新版本,如果买书,不建议买,可以购买上本参考书TypeScript实战指南)
我的个人博客:http://www.gaoyunjiao.fun/?p=114
深入浅出TypeScript(1)的更多相关文章
- 深入浅出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课:函数是一等 ...
随机推荐
- 2019杭电多校第一场hdu6581 Vacation
Vacation 题目传送门 update(O(n)) 看了那个O(n)的方法,感觉自己想的那个O(nlogn)的好傻,awsl. 0车最终通过停车线的时候,状态一定是某个车堵住后面的所有车(这个车也 ...
- [Abp vNext 源码分析] - 6. DDD 的应用层支持 (应用服务)
一.简要介绍 ABP vNext 针对于应用服务层,为我们单独设计了一个模块进行实现,即 Volo.Abp.Ddd.Application 模块. PS:最近博主也是在恶补 DDD 相关的知识,这里推 ...
- 关于Spring的JDBC连接mysql(与传统jdbc比较)
Spring的jdbc与Hibernate,Mybatis相比较,功能不是特别强大,但是在小型项目中,也到还是比较灵活简单. 首先可以看看一下传统的jdbc是如何操作的呢 传统JDBC 首先呢先要创建 ...
- 搭建python环境
参考文章:https://blog.csdn.net/qq_33855133/article/details/73106176 对于配置环境变量,懂些技术的人来说,都是很简单. 变量是在操作系统中一个 ...
- (读论文)推荐系统之ctr预估-NFM模型解析
本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...
- Gridea+GitHub搭建个人博客
某日闲余时间看到一篇介绍Gridea博客平台的文章,大概看了一下觉得此平台还不错,随即自己进入Gridea官网瞅了瞅.哇,这搭建过程也太简单了吧,比Hexo博客搭建要容易很多,而且还有后台管理客户端, ...
- django数据库事务
数据库原子操作 举个例子: 一个消费者在一个商户里刷信用卡消费,交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加 ...
- dubbo负载均衡是如何实现的?
dubbo的负载均衡全部由AbstractLoadBalance的子类来实现 RandomLoadBalance 随机 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀 ...
- ByteBuf
ByteBuf readerIndex ,读索引 writerIndex ,写索引 capacity ,当前容量 maxCapacity ,最大容量,当 writerIndex 写入超过 capaci ...
- PYNQ上手笔记 | ① 启动Pynq
现在人工智能非常火爆,一般的教程都是为博硕生准备的,太难看懂了,分享一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默,点☞这里☜进入传送门~ = = = = 我是华丽的分割线 = ...