TypeScript中文教程基础部分上----翻译自TS官方

js中每一个值在不同的操作运行中表现出一系列不同的行为,比如说下面这个例子:
message.toLowerCase();
message();
逐行看下,第一行调用了message的toLowerCase方法,第二行直接调用message。
大部分情况下我们并不知道message的值,不能完全说出上面这段代码的执行结果。每一个操作完全依靠最开始的赋值。
思考这几个问题:
1 messag是否可以调用?
2 messag是否有一个可以调用的方法 toLowerCase?
3 如果有,toLowerCase是否可以调用?
4 即便上述message 和 message.toLowerCase都可以调用,那么他们返回什么呢?
确认上述四个问题,需要在编写代码时记住他们的返回值,赋值等情况,并且还要保证细节处理是对的,否则你很难把握最后的结果。
下面是一个定义了的变量
const message = "Hello World!";
这样定义后上面第一行代码返回小写的 hello world!
第二行还是会报错
TypeError: message is not a function
如果我们能避免这样的错误就很好了。当我们运行代码时,js运行时便可以算出这个值的类型并知道他可以做什么。这部分要做(其实就是ts要做的)的就是像上面的报错一样告诉你 Hello World不是一个方法。
对于一些基础类型的值比如 string 和 number类型,我们可以通过 typeof 判断他的类型。但是对于其他的类型比如 function, 我们没有对应的运行时机制判断下面这个方法:
function fn(x) {
return x.flip();
}
观察这段代码,他只会在参数带有一个可以调用的 flip方法时才会正常执行,但是js不会立刻显示一条警告的信息,除非这个方法被执行。这个fn方法只有在调用了才知道发生了什么。这样在你编写代码的时候你无法预测他的正确性。在这个例子中,type 的概念就是描述什么样的值可以当作参数传入,js是动态类型的,只有在运行后才能知道结果。
ts(当然了还有轻量级的 flowJS)正是一种备选方法,使用一种静态类型系统预测并检查你的代码。
静态类型检查
基础类型有三种:string number (包含了int 和 float) boolean
Array:Array<number> 或者 number[ ]
any:可以是任何类型,并且不会触发 ts 的checker
变量的类型声明
当你使用 const let var 声明一个变量时,你可以添加一个确定的类型
比如:let name: string = 'bowen'; 注意:类型声明写在变量的右边
大部分情况下即使你不去声明一个类型,ts也会在初始化的时候自行判断类型,但是ts不正是提高维护性和可读性的一种系统吗?
Function,ts允许你指定输入(入参)类型和输出(返回值)类型
入参
例如:function greet(name: string) {
console.log('hello' + name.toUpperCase() + '!');
}
如果这样调用就会报错 greet(23)
这样才对 greet('bowen')
返回值,跟在参数列表之后声明
例如:function getFavoriteNumber(): number {
return 24;
}
Anonymous Functions 匿名函数
匿名函数和具名函数有些不同,当一个函数(匿名的)出现 ts 会计算出他将以什么样的形式被调用,以及自动判断入参类型。
例如:
const names = ['Alice', 'Bowen', 'Dimi']
names.forEach(function(name) {
console.log(name.toUppercase());
// toUppercase
// toUpperCase
})
这里的匿名函数入参 name 会根据names 取值判断,所以判断name是string,进而判断是否具有toUpperCase方法
Object Types
除了上面提到的基础类型,你大部分时间会遇到的是Object类型。定义一个Object类型,可以简单看作就是在罗列出属性和他的类型。
例如:
一个函数接受一个Object类型的入参
function printCoord(pt: { x: number; y: number }) {
......
}
我们在这里定义了一个Object参数,你可以使用 , 或者 ; 分割每一个属性
可选属性,Object类型可以指定部分或者全部的属性是可选的,只需要在可选参数的名称后面添加一个 ? 即可;
例如:
function printName(obj: { first: string; last?: string }) {
......
}
Both
printName({ first: 'Bowen' })
printName({ first: 'Bowen', last: 'Nan' })
js中,如果你访问一个不存在的属性,你会得到一个 undefined ,所以在你定义了一个可选参数后,必须在使用前加以判断
例如:
function printName(obj: { first: string; last?: string }) {
console.log(obj.last.toUpperCase()); // 这里 last可能是 undefined
//正确的做法
if (obj.last !== undefined) {
console.log(obj.last.toUpperCase())
}
//或者
console.log(obj.last?.toUpperCase());
}
联合类型
ts 的类型系统允许您使用各种各样的运算符在现有类型的基础上构建新类型。现在我们知道了如何编写一些类型,是时候开始以有趣的方式组合它们了。
定义一组联合类型
例如:
function printId(id: number | string) {
console.log('your id is' + id)
}
Both
printId(200)
printId('300')
怎么合理使用联合类型:对于联合声明的每一个类型成员都拥有可执行的方法
例如:
function printId(id: number | string) {
console.log(id.toUpperCase()) //因为number 不存在一个toUpperCase方法
}
解决方法和上面的可选类型类似:减少类型声明和逻辑代码的结合,看作是普通的js逻辑判断
例如:
function printId(id: number | string) {
if (typeof id === 'string') {
console.log(id.toUpperCase())
}else {
console.log(id)
}
}
当然了如果联合声明中的每个成员都有一样的属性方法,就可以忽略上述if else 的判断
例如:number[] (这是一个以number填充的Array) 和 string 都拥有一个 slice 的方法
function getFirstThree(x: number[] | string) {
return x.slice(0, 3);
}
TypeScript中文教程基础部分上----翻译自TS官方的更多相关文章
- TYPESCRIPT中文教程基础部分下----翻译自TS官方
type 别名 我们已经使用过 object 和 联合的方式 直接声明类型.但是某个类型在使用多次的情况下就要用到别名了. 别名的语法就像是在定义一个具名的对象一样: type Point = { x ...
- TypeScript 中文教程之缩小----部分翻译自TS官方
Narrowing概念:字面意思是缩小,可以理解为细化或者您觉得更好的代名词. TS官方在这里做了很详细的说明,文字较多,简单以图片概括: typeof type guards 类型防护过程,可以通 ...
- 转载:《TypeScript 中文入门教程》
缘由 事情是这样的,我想搜索 TypeScript 中文教程,结果在 https://www.baidu.com , https://cn.bing.com ,上都找不到官方的翻译,也没有一个像样的翻 ...
- 转载:TypeScript 简介与《TypeScript 中文入门教程》
简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...
- 【转】TypeScript中文入门教程
目录 虽然我是转载的,但看在Copy这么多文章也是很幸苦的好吧,我罗列一个目录. 转载:<TypeScript 中文入门教程> 17.注解 (2015-12-03 11:36) 转载:&l ...
- 《TypeScript 中文入门教程》
转载:<TypeScript 中文入门教程> 17.注解 (2015-12-03 11:36) 转载:<TypeScript 中文入门教程> 16.Symbols (2015- ...
- Python爬虫教程-07-post介绍(百度翻译)(上)
Python爬虫教程-07-post介绍(百度翻译)(上) 访问网络两种方法 get: 利用参数给服务器传递信息 参数为dict,使用parse编码 post :(今天给大家介绍的post) 一般向服 ...
- 【HttpClient4.5中文教程】【第一章 :基础】1.1运行请求(二)
很多其它HttpClient4.5中文教程请查看:点击打开链接 ==================================================================== ...
- SpringBoot图文教程「概念+案例 思维导图」「基础篇上」
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 每个知识点配套自测面试题,学完技术自我测试 本文初学向,所以希望文中所有的代码案例都能敲一遍 大哥大姐 ...
随机推荐
- pandas基础学习一
生成对象 用值列表生成 Series 时,Pandas 默认自动生成整数索引: In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8]) In [4]: s Out ...
- jstl中的foreach标签
<%@ page import="java.util.ArrayList" %><%@ page import="java.util.List" ...
- proxy跨域
跨域 浏览器访问非同源的网址时,会被限制访问,出现跨域问题. 解决方案: 1.response 添加 header(CORS) 2.JSONP 方式 3.全局对象+iframe (1)document ...
- CentOS7学习笔记(四) 常用命令记录
查看命令的帮助信息 man 命令查看帮助信息 在想要获取帮助信息的命令前面加上man即可,例如查看ls命令的帮助信息 [root@localhost ~]# man ls help 命令查看帮助信息 ...
- A New Discrete Particle Swarm Optimization Algorithm
题目:一种新的离散粒子群优化算法 中文摘要 粒子群优化算法在许多优化问题上表现得非常好.粒子群优化算法的缺点之一是假设算法中的变量为连续变量.本文提出一个新的粒子群优化算法,能够优化离散变量.这个新算 ...
- 2020 NUPCTF pwn题目
去年的一场比赛,今年来把去年不会做的题目来看一下,只在buu找到三道题,剩下两道好像是内核题,算了,估计找到也不会做. npuctf_2020_level2 bss段上的格式化字符串漏洞的利用. 程序 ...
- Kafka从入门到放弃(三)—— 详说消费者
之前介绍了Kafka以及生产者,包括它的一些特性和参数,这回写一下消费者. 之前没看得可以点击链接阅读. Kafka从入门到放弃(一) -- 初识Kafka Kafka从入门到放弃(二) -- 详说生 ...
- CF1501A Alexey and Train 题解
Content 一列火车从 \(0\) 时刻开始从 \(1\) 号站出发,要经过 \(n\) 个站,第 \(i\) 个站的期望到达时间和离开时间分别为 \(a_i\) 和 \(b_i\),并且还有一个 ...
- java 多线程: Thread 并发访问-代码块同步synchronized {};String作为被锁的对象
方法同步的弊端 方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是还有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并 ...
- java 常用类库:String ; StringBuilder和StringBuffer类
1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...