TS学习笔记(一):基础类型

107 阅读4分钟

布尔值: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

undefinednull两者各自有自己的类型分别叫做undefinednull,非严格模式下可以赋值给任何类型。

let str: string = null
let str2: string = undefined

当你指定了--strictNullChecks标记开启严格模式后,nullundefined只能赋值给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 表示其他属性可随意设置