布尔值:boolean
与Javascript没有区别
let a:boolean = false
数字:number
支持二进制、八进制、十进制和十六进制
let number1: number = 6;
let number2: number = 0xf00d; // 十六进制
let number3: number = 0b1010; // 二进制
let number4: number = 0o744; // 八进制
字符串:string
可以使用单引号(' ')或双引号(" ")来表示
let str1: string = 'hello'
let str2: string = "hi"
可以使用模板字符串,用反引号(` `)表示,可以使用${}内嵌变量
let name: string = 'Jack'
let str: string = `Hello, my name is ${name}`
也可以使用加号(+)连接字符串或变量
let age: number = 18
let str: string = 'Hello, my age is' + age + '!\n'
数组:array
定义数组有两种方式
- 在类型后面跟上[],表示数组元素为该类型
let arr: number[] = [1,2,3]
- 使用Array加泛型表示
let arr: Array<number> = [1,2,3]
Null和Undefined
undefined和null两者各自有自己的类型分别叫做undefined和null,非严格模式下可以赋值给任何类型。
let str: string = null
let str2: string = undefined
当你指定了--strictNullChecks标记开启严格模式后,null和undefined只能赋值给void和它们各自
元组:Tuple
用于表示一个已知元素数量和类型的数组
let arr: [string, number]
arr = ['hello', 10] // true
arr = [10, 'hello'] // false
访问已知索引元素会得到该元素对应的类型
console.log(typeof arr[0]) // string
给越界元素赋值则会使用联合类型代替,如上面的例子则应是(string | number)
arr[3] = 15// true,属于number类型
arr[4] = 'hi'// true,属于string类型
arr[5] = false// false,boolean类型不属于上述联合类型
枚举类型:enum
使用enum为变量声明几个可选项,可以根据索引找到元素名,也可根据元素名找到索引
enum Animal {Cat, Dog, Duck}
每个元素对应一个索引,默认从0开始,也可以手动为元素声明索引
let a = Animal.Cat
console.log(a)// 0
// 第一个元素索引为1,后面的元素按顺序顺延
enum Animal {Cat=1, Dog, Duck}
let a = Animal.Cat
console.log(a)// 1
console.log(Animal.Duck)// 3
enum Animal {Cat=1, Dog, Duck=4}
let a = Animal[3]
console.log(a)// undefined,现在只有索引1,2,4
console.log(Animal.Duck)// 4
Any
可以是任何类型,在编译时可以跳过变量的类型检查。any可以赋值给任何类型
// 为变量赋任何值
let a: any = 15
a = 'Jack'
// 定义包含任何类型的数组
let arr: any[] = [1, 'no', true]
Object类型也可以赋任何值,但不能调用任何方法,any可以
let notSure: any = 4;
notSure.ifItExists(); // ok, 该方法在运行时可能存在
notSure.toFixed(); // okay, toFixed方法存在,但编译器不会检查是否存在
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
Void
表示没有任何类型。
- 在函数没有返回值时使用
function fn: void(){
console.log('hello')
}
- void类型变量只能赋值为null或undefined
let a: void = null
Never
表示永远不存在值。例如总是抛出错误的函数或死循环函数。never可以赋值给任何类型的变量,但只有never可以赋值给never类型变量
// 永远抛出错误
function fn1(){
throw new Error('error')
}
// 死循环
function fn2(){
while(true){}
}
Unknown
未知类型,与any类似。区别在于unknown类型的值执行某些操作前要进行一些必要的检查。如unknown只能赋值给any和unknown类型,因为我们并不知道unknown类型存储的变量是什么类型。
let value: any = true
let value2: number = value // ok
let value: unknown = 15
let value2: number = value //error 尽管类型是正确的
unknown类型的值也不能任意地执行各种方法
let value: unknown;
value.foo.bar; // Error
value.trim(); // Error
可以通过判断类型的方式缩小unknown类型变量的范围,从而调用该类型的方法
let value:unknown = '1'
if(typeof value==='string'){
value.trim() // ok
}
Object
一般可以用两种方法定义
- 类型直接设定为Object
let a: object={}
- 用{}定义,且可以规定对象内的属性及类型
let a: {name: string}
a = {name: 'Jack'} // true
a = {name: 15} // false,name必须是string类型
// 属性多了或少了都不行
a = {age = 15} //false
a = {name = 'Jack', age = 15} // false
可选属性及其他属性
let a: {name: string, age?: number} // 用?表示可选属性
let a: {name: string, [propName: string]: any} // [propName: string]: any 表示其他属性可随意设置