用typescript完成倒计时_TypeScript(一):类型
经过3个月的使用,在 TypeScript 方面学到了一些东西,总结一下。
在您阅读本文之前需要了解到的是,本文的内容仅是个人观点,我也并非 TypeScript 主要维护者和贡献者,也没有邀请 TypeScript 的权威人士进行审核,所以我无法保证本文的完全正确性,但我已反复修正果本文的内容,以尽量保证它的正确性。当你们发现了任何技术错误或表意有争议的地方,欢迎在评论区提出,我会及时更新内容,以免误导他人。
因为内容较多,我将相关的内容分为了几篇文章,相关系列文章有:
- 类型
- type & interface
- 函数类型
- 泛型
namespace
&module
- tsconfig.json
- 类型兼容:赋值和
extends
- 高级类型
- 最佳实践
JavaScript 是动态类型、弱类型的语言,而动态类型(即变量运行时的类型可以变化)系统会导致一些很严重的问题(具体可看问题动态类型的语言的优缺点有哪些?),而弱类型允许的隐式的类型转换也会带来一些问题(具体可看弱类型语言比强类型语言的优势、劣势、分别是什么?),而 TypeScript 作为 JavaScript 的超集,他在拥有 JavaScript 所有能力的基础上,做到了静态类型,这解决了 JavaScript 编写不规范会导致的很多问题,虽然它依旧是弱类型语言,但它在变量进行类型隐式转换时也做了限制,让它在编写的过程中可以更加规范。而不规范的地方,会直接报错来提醒开发者。
TypeScript 的类型推导是基于上下文类型推导(Contextual Typing)的。所以即便你不添加任何类型,编译器也会根据编写的代码,推导出变量或函数的类型,当无法推导出的时候,TypeScript 则将其设置为any
。至于什么是any
,下文中会进行介绍。
在进入本文正题之前有一个概念需要明确一下。一个变量的类型是该变量可选值的集合,比如number
就是所有数字的集合,而子类型的可选值的集合是超类型可选值集合的子集。理解了这个之后,对于理解 TypeScript 中的一些类型和设定有很大的帮助。
基础类型
这一部分的类型也是 JavaScript 中的基本类型,但也增加了一些非常有用的类型如tuple
和 enum
,虽然他们的本质是Array
和object
。
Boolean
boolean
是很简单false
和true
的集合
let isDone: boolean = false;
Number
number
是所有数字的集合,各个进制数字的写法也和 JavaScript 保持一致。
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
String
在 TypeScript 中同样支持双引号和单引号的字符串。
let color: string = "blue";
color = 'red';
Array
TypeScript 中数组的写法有两种。
// Type[]
let list: number[] = [1, 2, 3];
或
// Array<Type>
let list: Array<number> = [1, 2, 3];
而因为有可能用到 JSX 语法,第二种写法会和 JSX 语法冲突,为了保持一致性,所以推荐使用第一种。
数组类型也是一些变量的集合,例如:
number[]
就是[number]
、[number, number]
、[number, number, number]
...的集合,而其中的number
则如上所说是所有数字的集合。
Tuple
元组类型是几种类型的数组形式的固定组合,如下:
// Declare a tuple type
let x: [string, number];
// Initialize it
x = ["hello", 10]; // OK
// Initialize it incorrectly
x = [10, "hello"]; // Error
元组类型在我看来是数组类型的子类型,如上number[]
就是一些元组的集合。
而[string, number]
则是string | number[]
的子类型。即string | number[]
为 number[]
、string[]
、[string, number ...]
...,其中就包括一个[string, number]
。
Enum
enum
这个操作符比较特殊,它的定位类似于var
、let
、const
,用于声明变量,但它只支持特定结构的变量声明,而这个结构就是一个对象。它的用法如下:
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
它的本质就是构建了一个对象,对象中属性的值默认从0
开始,依次加1
。 当然你也可以设置为其他的值。
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;
Object
object
是对象类型,即它是所有对象的集合。
特殊类型
这里会介绍一下在 TypeScript 类型系统中的空值、bottom type、top type等。
Null & Undefined
null
和undefined
都是空值,但因为在 JavaScript 中typeof
操作符的行为,未定义的变量和定义了但未赋值的变量都是undefined
,所以推荐定义了变量之后不会即刻赋值时,设置空值为null
,这样可以区分开typeof
的行为,当然这样可能会引入另一个问题,即typeof null
为object
但依旧推荐这样做,可以在判断空值时直接使用foo !== null
。
Unknown
unknown
是 TypeScript 中的 top type,即任何类型都是它的子类型,它是 TypeScript 中所有可选值的集合。
Never
never
是 TypeScript 中的 bottom type,即它是任何类型的子类型,但在 TypeScript 中它有着其他的作用,比如,当尝试给一个never
类型的变量赋值时,中断当前程序运行,并抛出异常。
Any
any
是 TypeScript 中非常特殊的类型,它既是 top type,又是 bottom type,即任何类型都是它的子类型,它又是任何类型的子类型。是不是很矛盾?但它的价值就在这里,TypeScript 目前还无法完美支持 JavaScript 的所有能力,any
就相当于一个缓冲,就是当你要做的事情 TypeScript 当前的类型系统还不支持的时候,就用any
告诉编译器,这个你还不懂,但它是对的,然后编译器会非常相信你,当遇到any
的时候,不做任何的类型检查。
所以在使用any
之前,你要用尽浑身解数,尝试用 TypeScript 当前支持的能力来完成你所要做的工作,但当你发现 TypeScript 无法做到的时候,你就可以使用any
了。
特殊能力
类型断言
当一个变量的类型不是你所想要的那个变量的时候,你可以通过类型断言来让它变成你想要的类型,他有两种用法,如下。
一种是尖括号:
let someValue: any = "this is a string";let strLength: number = (<string>someValue).length;
另一个是as
操作符:
let someValue: any = "this is a string";let strLength: number = (someValue as string).length;
知道了它的用法,但在什么情况下,我们需要用到这个功能呢?
一般来说,子类型的变量可以赋值给父类型的变量,即:
interface Foo {a: string
}
interface Bar extends Foo {b: number
}
let foo: Foo = {a: 'foo'
}
let bar: Bar = {a: 'bar',b: 0
}
foo = bar
这样是可以的,但有些时候我们可能需要这样做
bar = foo // error: Property 'b' is missing in type 'Foo' but required in type 'Bar'.ts(2741)
但直接这样做会报错,所以 TypeScript 允许我们
bar = foo as Bar
这样做。
当然类型断言使用的时候是有条件的,即断言的类型和被断言的变量类型之间必需构成父子类型的关系,否则也会报错。即:
let foo: string = 'foo'
let bar: number = 0foo = bar as string // error: Conversion of type 'number' to type 'string' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.ts(2352)
其中string
和number
不存在父子类型的关系,所以使用类型断言会报错。
但有时候我们还是会遇到如此极端的情况,那可以怎么做呢?
可以先断言为unknown
或never
或any
再断言为想要的类型,即:
let foo: string = 'foo'
let bar: number = 0foo = bar as unknown as string
原理是unknown
是 top type,never
是 bottom type,any
既是 top type,也是 bottom type,均满足两次断言的条件。但我们推荐使用unknown
,这样有更强的语意性。
本文结束。
我所知道的前端zhuanlan.zhihu.com
用typescript完成倒计时_TypeScript(一):类型相关推荐
- 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript
作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...
- 系统学习 TypeScript(五)——联合类型
前言 在初步学习了 TypeScript 的变量声明后,对它的静态类型检查功能简直是爱不释手,但同时也发现一个问题:在正常的开发中,一个变量的类型有时可能不仅仅只限于 number 或者 string ...
- [TypeScript] 编程实践之1: Google的TypeScript代码风格3:类型
TypeScript语言规范 3 类型 3.1 Any类型 3.2 基本类型 3.2.1 Number类型 3.2.2 Boolean类型 3.2.3 String类型 3.2.4 Symbol类型 ...
- TypeScript真香系列-高级类型
前言 TypeScript真香系列的内容将参考中文文档,但是文中的例子基本不会和文档中的例子重复,对于一些地方也会深入研究.另外,文中一些例子的结果都是在代码没有错误后编译为JavaScript得到的 ...
- 5.TypeScript入门之TS高级类型(class类)
上一章节:4.TypeScript入门之TS常用类型(3) Ⅳ.TypeScript高级类型 概述 TS中的高级类型有很多,重点学习以下高级类型: class类 类型兼容性 交叉类型 泛型和 keyo ...
- TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)
2019独角兽企业重金招聘Python工程师标准>>> 转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions) 高级类型 可辨识联合(D ...
- typescript 叹号_TypeScript系列(五)最佳实践
前言 在进入主题之前,我们先来简单回顾一下前四篇文章想要表达的主题: 当Redux遇到TypeScript:这篇文章从redux的action出发,介绍了as和可判别联合类型(Discriminate ...
- TypeScript 2.1中的类型运算 一个递归的Readonly泛型
去年12月的 TypeScript 2.1 中加入了 keyof / Lookup Types / Mapped Types 等 (编译期的) 类型运算特性. 本文将介绍这些特性,并用这些特性实现一个 ...
- Typescript常见三种函数类型
Typescript有常见三种函数类型: 分别是普通的函数: 有可选参数的函数: 有剩余参数的函数: 普通函数 function findMan(age:number):string{return ' ...
最新文章
- iframe批量异步上传图片
- 9.2-3 pstree pgrep
- 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起
- leecode53 最大子序列和
- go + influxdb + grafana 日志监控系统
- win7系统,virtualBox导入centos7.3报错
- excel两列相同匹配第三列_Vlookup函数解决Excel大量数据匹配问题
- JavaScript重难点解析4(作用域与作用域链、闭包详解)
- 模拟登陆github
- sql语句分组mysql_MySQL GROUP BY 语句_sql语句group by_分组
- 优秀的UI/UX设计师需要具备哪些技能?
- obs 推流编码在哪设置_直播工具OBS推流配置操作指引
- 一图看懂编程语言分类
- “Defaulting to user installation because normal site-packages is not writeable“
- 2011刚上市的句子
- 计算机中休眠是哪个键,笔记本的睡眠键和休眠键区别和作用有哪些
- 微信小程序开发之数据存储 参数传递 数据缓存
- 智力问答选择题_智力问答题库(全)
- 选好食用油,为健康加油!
- 对日软件外包开发浅谈
热门文章
- ip地址合法性检查 php,php检查验证IP为有效IP地址函数
- android平台代号、版本、API 级别和 NDK 版本
- android fragment学习4-底部布局扩展TabLayout
- python入门第六章 信息安全策略-文件备份 用户账户管理
- 基于JAVA+SpringBoot+Mybatis+MYSQL的图书借阅管理系统
- linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
- 【JVM】Java虚拟机
- 移动测试之-流量测试方案
- Sublime Text 2安装汉化破解、插件包安装教程
- 一种牛逼的网站分享插件实现