经过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 中的基本类型,但也增加了一些非常有用的类型如tupleenum,虽然他们的本质是Arrayobject

Boolean

boolean是很简单falsetrue 的集合

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这个操作符比较特殊,它的定位类似于varletconst,用于声明变量,但它只支持特定结构的变量声明,而这个结构就是一个对象。它的用法如下:

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

nullundefined都是空值,但因为在 JavaScript 中typeof操作符的行为,未定义的变量和定义了但未赋值的变量都是undefined,所以推荐定义了变量之后不会即刻赋值时,设置空值为null,这样可以区分开typeof的行为,当然这样可能会引入另一个问题,即typeof nullobject但依旧推荐这样做,可以在判断空值时直接使用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)

其中stringnumber不存在父子类型的关系,所以使用类型断言会报错。

但有时候我们还是会遇到如此极端的情况,那可以怎么做呢?

可以先断言为unknownneverany再断言为想要的类型,即:

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(一):类型相关推荐

  1. 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript

    作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...

  2. 系统学习 TypeScript(五)——联合类型

    前言 在初步学习了 TypeScript 的变量声明后,对它的静态类型检查功能简直是爱不释手,但同时也发现一个问题:在正常的开发中,一个变量的类型有时可能不仅仅只限于 number 或者 string ...

  3. [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类型 ...

  4. TypeScript真香系列-高级类型

    前言 TypeScript真香系列的内容将参考中文文档,但是文中的例子基本不会和文档中的例子重复,对于一些地方也会深入研究.另外,文中一些例子的结果都是在代码没有错误后编译为JavaScript得到的 ...

  5. 5.TypeScript入门之TS高级类型(class类)

    上一章节:4.TypeScript入门之TS常用类型(3) Ⅳ.TypeScript高级类型 概述 TS中的高级类型有很多,重点学习以下高级类型: class类 类型兼容性 交叉类型 泛型和 keyo ...

  6. TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)

    2019独角兽企业重金招聘Python工程师标准>>> 转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions) 高级类型 可辨识联合(D ...

  7. typescript 叹号_TypeScript系列(五)最佳实践

    前言 在进入主题之前,我们先来简单回顾一下前四篇文章想要表达的主题: 当Redux遇到TypeScript:这篇文章从redux的action出发,介绍了as和可判别联合类型(Discriminate ...

  8. TypeScript 2.1中的类型运算 一个递归的Readonly泛型

    去年12月的 TypeScript 2.1 中加入了 keyof / Lookup Types / Mapped Types 等 (编译期的) 类型运算特性. 本文将介绍这些特性,并用这些特性实现一个 ...

  9. Typescript常见三种函数类型

    Typescript有常见三种函数类型: 分别是普通的函数: 有可选参数的函数: 有剩余参数的函数: 普通函数 function findMan(age:number):string{return ' ...

最新文章

  1. iframe批量异步上传图片
  2. 9.2-3 pstree pgrep
  3. 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起
  4. leecode53 最大子序列和
  5. go + influxdb + grafana 日志监控系统
  6. win7系统,virtualBox导入centos7.3报错
  7. excel两列相同匹配第三列_Vlookup函数解决Excel大量数据匹配问题
  8. JavaScript重难点解析4(作用域与作用域链、闭包详解)
  9. 模拟登陆github
  10. sql语句分组mysql_MySQL GROUP BY 语句_sql语句group by_分组
  11. 优秀的UI/UX设计师需要具备哪些技能?
  12. obs 推流编码在哪设置_直播工具OBS推流配置操作指引
  13. 一图看懂编程语言分类
  14. “Defaulting to user installation because normal site-packages is not writeable“
  15. 2011刚上市的句子
  16. 计算机中休眠是哪个键,笔记本的睡眠键和休眠键区别和作用有哪些
  17. 微信小程序开发之数据存储 参数传递 数据缓存
  18. 智力问答选择题_智力问答题库(全)
  19. 选好食用油,为健康加油!
  20. 对日软件外包开发浅谈

热门文章

  1. ip地址合法性检查 php,php检查验证IP为有效IP地址函数
  2. android平台代号、版本、API 级别和 NDK 版本
  3. android fragment学习4-底部布局扩展TabLayout
  4. python入门第六章 信息安全策略-文件备份 用户账户管理
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的图书借阅管理系统
  6. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
  7. 【JVM】Java虚拟机
  8. 移动测试之-流量测试方案
  9. Sublime Text 2安装汉化破解、插件包安装教程
  10. 一种牛逼的网站分享插件实现