您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

TypeScript 基础类型

自本节起,我们将开始接触 TypeScript 的类型系统,这也是 TypeScript 最为核心的部分。

本节介绍 TypeScript 中一些基础类型,有些特殊类型会在接下来进行单节描述。在进行变量声明时,需要注明其对应的类型,这个跟 JavaScript 的变量声明不同。在写 TypeScript 时,所有的变量都需要有类型,这个观点要深刻的烙印在心里。

TypeScript 中的类型有:

最简单的数据类型就是 true / false 值:

const registered: boolean = false
const done: boolean = Boolean()

变量声明语法:冒号 : 前面是变量,后面是变量类型。

二进制数、十进制数、十六进制数都可以用 number 类型来表示。

let decLiteral: number = 
let goldenSection: number = 
let hexLiteral: number = 
let binaryLiteral: number = 
let octalLiteral: number = 
let notANumber: number = 

双引号或者单引号表示字符串:

let protagonist: string = "Sherlock Holmes"
let partner: string = 'Dr. John Hamish Watson'

使用模板字符串:

let protagonist: string = 'Sherlock'
let sentence: string = `华生是${protagonist}的朋友、助手和室友。`

模板字符串使用反引号来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法 ${expression} 的占位符,占位符内可以写变量名,模板字符串会进行变量值的解析。

当没有返回值时,可以将其返回值类型定义为 void:

function doNothing(): void {
  let a  = 
}

声明 void 类型的变量没有什么用,因为你只能将它赋值为 undefinednull

let nothing: void = undefined

undefinednull 是所有类型的子类型。

一般项目是认开启 --strictNullChecks 检测的(这句话不明白是什么意思),如果你将 tscon.jsonstrictNullChecks 选项设置为 false,下面这种操作不会报错,不过尽量不要这么做:

let num: number = undefined
let list: number[] = undefined
let name: string = undefined

数组类型有两种表示,第一种在元素类型后接上 [],表示由此类型元素组成的数组:

let list: number[] = [, , ]
let names: string[] = ['Sherlock', 'Watson', 'Mrs. Hudson']

另一种方式是使用数组泛型(泛型后续会单独介绍),Array<元素类型>

let list: Array<number> = [, , ]
let names: Array<string> = ['Sherlock', 'Watson', 'Mrs. Hudson']

混合各种元素类型:

let list: any[] = ['Sherlock', ]

推荐使用第一种数组类型的表示,书写比较简洁直观。

有时候接收来自的输入,我们是不能确定其变量类型的。这种情况下,我们不希望类型检查器对这些值进行检查,而是直接让它们通过编译阶段的检查,此时可以使用 any

let input: any = 'nothing'

input =                    // ok
input = true                // ok
input = []                  // ok
input = null                // ok
input = Symbol('any')       // ok

如果数据是 any 类型,那么可以访问它的任意,即使这个不存在:

let anything: any = 

anything.eat()              // ok
anything.name               // ok
anything[]                 // ok
new anything()              // ok
anything()                  // ok

从上面的例子中可以看到,any 类型几乎可以做任何操作,这样很容易编写类型正确但是执行异常的。我们使用 TypeScript 就是为了的健壮性,所以要尽量减少 any 的使用

object 表示非原始类型(non-primitive type):

let obj: object

// 枚举类型
enum TokenType {
  ACCESS = 'accessToken',
  REFRESH = 'refreshToken'
}

obj = TokenType
obj = [, , ]
obj = [, 'string'] // 类型
obj = { a:  }

可以看到枚举、数组、和普通对象都是 object 类型。

let a: Number = new Number('10') // a === 10 为 false
let b: number = Number('10') // b === 10 为 true

a instanceof Number // true
b instanceof Number // false

解释:

第 1 行,通过 new Number('10') 得到的是构造,本质是对象。

第 2 行,Number('10')10 都是声明数字 10 的,本质就是数字。

第 4 - 5 行,instanceof 运算符用于检测构造的 prototype 是否出现在某个实例对象的原型链上。a 是对象,它的 __proto__ 指向该对象的构造的原型对象 Number,所以为 trueb 是数字,所以为 false

__proto__ 是非标准,你也可以使用 Object.getPrototypeOf() 来访问对象的原型:

a.__proto__ === Object.getPrototypeOf(a) // true

本小节介绍了 TypeScript 一些基本类型,需要记住的是:


联系我
置顶