一.类型声明
类型声明是TS非常重要的一个特点
通过类型声明可以指定TS中变量(参数,形参)的类型
指定类型后,当为类型赋值时,TS编译器会自动检查值是否有符合类型声明,符合则赋值,否则报错
简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值
语法:
let a: number = 123;//声明一个变量a,同时指定它的类型为number
// a的类型设置为number,在以后使用的过程中a的值只能是数字
a = 9
// a = 'hello' 会报错
function sum(a: number, b: number): number {
return a + b;
}
console.log(sum(123, 456))
二.自动类型判断
TS拥有自动的类型判断机制
当对变量的声明和赋值是同时进行的,使得变量只能存储某种类型的值
所有如果你的变量的声明和赋值是同时进行的,可以省略掉类型声明
三.类型
// 直接使用字面量进行类型声明
let b: 10
// b = 11 会报错,不能将类型“11”分配给类型“10”
// 可以使用“|”连接多个类型(联合类型)
let gender: "male" | "female"
gender = "male"
gender = "female"
let c: boolean | string
c = false
c = "hello"
// any 表示任意类型,相当于关闭了ts的类型检测; 声明时如果不指定类型,ts解析器会自动判断变量的类型为any(隐式any)
let d: any
d = 111;
d = true
d = "world"
// unknown 表示未知的类型,不能直接赋值给其它变量,实际上就是一个类型化安全的any
let e: unknown = 10
let s: string
s = d //d的类型是any,s是string,d可以赋值给任意变量,不会报错
// s = e 会报错,不能将类型“unknown”分配给类型“string”
// 类型断言,可以用来告诉解析器变量的实际类型
// 语法: 1 变量 as 类型 2 <类型>变量
s = e as string
console.log('s', s) // 10
s = <string>e
// void 用来表示为空,以函数为例,就表示没有返回值的函数
function fn1(): void {
return
}
// never 表示永远不会返回结果,用来抛出错误
function fn2(): never {
throw new Error("出错了!")
}
// object表示一个对象
let a2: object
a2 = {}
a2 = function () { }
// {}用来指定对象中包含哪些属性 语法:{属性名:属性值}
// 在属性名后加上?,表示属性是可选的
let a3: { name: string, age?: number }
a3 = { name: "孙悟空" }
a3 = { name: "孙悟空", age: 500 }
// [propName{ame:string]:any
let a4: { name: string, [propName: string]: any }
a4 = { name: "孙悟空", age: 500, gender: "male" }
// 用来定义函数结构的类型声明
// 语法:(形参:类型,形参:类型,...) =>返回值
let fn3: (a: number, b: number) => number
fn3 = (n1, n2) => {
return n1 + n2
}
// 数组的声明方式
// 语法 类型[] Array<类型>
let arr: string[] // 表示字符串数组
let arr2: number[]
let arr3: Array<string>
// tuple(元组:就是固定长度的数组)
let tu: [string, string]
tu = ["hello", "world"]
// enum 枚举
enum Gender {
Male,
Female,
Xmale
}
let enum1: { name: string, gender: Gender }
enum1 = {
name: "孙悟空",
gender: Gender.Male
}
// 类型的别名
type MyType = 1 | "hello" | 3 | true | 5
let f: MyType
f = 1
f = "hello"
f = true
// f = 6 报错,