简述
Typescript发展至今,已经成为大型项目标配。其提供的静态类型系统,大大增强了代码的可读性以及可维护性。尽管如此,在很多开发者意识里,依然认为Typescript仅仅是javascript的超集,或者有类型限制的javascript。这样描述本身并没有错,但未能触及Typescript的核心。Typescript的核心是类型(Type)以及类型操作。只有认识和熟练掌握了类型操作,能够像操作语言一样操作类型,才算真正窥探Typescript的内在意义。
从认识类型操作符开始
面向Type编程是一个伪概念,软件工程中不存在这种概念。为了提高对Type以及Type oprator的关注度,我刻意创造出来的一个不规范名词。引导大家从了解和掌握类型操作角度,去重新认识Typescript编程。
Typescript中有很多类型操作符,例如用来声明类型和接口的type和interface;还有关键字typeof、keyof、in、extends、infer;以及()、[]、{}、=、<>、:、;、?、&、|等界限符。下面我们一起来初步认识一下这些熟悉而又陌生的类型操作符,这里我们主要讨论关键字操作符。
特别说明,文章需要一定Typescript基础知识。如果你对typescript语言比较陌生,建议先去了解一下Typescript语言的基本知识,再来一起讨论这个话题。
一、 typeof操作符
1. js表达式中typeof用来返回一个变量的基本数据类型
,如'string'、'number'、'function'、'object'
typeof 1 // 'number'
typeof true // boolean
typeof 'hello world' // 'string'
typeof function(){} // 'function'
typeof {} // 'object'
typeof [] // 'object'
typeof null // 'object'
typeof undefined // 'undefined'
typeof new RegExp() // 'object'
typeof Symbol() // symbol
2. 在Typescript中,typeof可以获取变量的声明类型
typeof在typescript中还可以用来返回一个变量的声明类型,如果不存在,则获取该类型的推论类型。typeof在上下文中的作用决定了返回值是什么。是类型查询?还是表达式?前者是返回类型(types),而后者返回类型值(values)。例如,console.log、if判断、变量声明let,var等操作中typeof返回变量的类型的字符串名称,而type关键字限制下,typeof返回变量的类型
例如:
let n: number = 1
type TN = typeof n
/** 等同于
* TN == number
*/
let s:string = 'hello world'
type TS = typeof s
/** 等同于
* TS == string
*/
let a: Array<number> = []
type TA = typeof a
/** 等同于
* TA == number[]
*/
let sy: Symbol = Symbol()
type TSY = typeof sy
/** 等同于
* TSY == Symbol
*/
这里有一点需要说明,不能单纯的通过关键字,判断typeof在上下文中的作用。而是综合的来判断是属于表达式还是类型查询。比如,下面例子中,虽然出现了let关键字,但是很明显typeof出现在类型定声明的位置上,因此这里是类型查询,typeof s返回s2的声明类型string
let s2: string = 'hello'
let s3: typeof s = 'wo