基础类型
boolean
let isb:boolean = true
number
let age:number = 18
string
let str:string = '18'
undefined
let u:undefined = undefined
null
let n:null = null
数组类型
let list: number[] = [1, 2, 3]
list.push(4)
数组里的项写错类型会报错 push 时类型对不上会报错 如果数组想每一项放入不同数据怎么办?用元组类型
元组类型
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
let tuple: [number, string] = [18, 'lin']
写错类型会报错 越界会报错
可以对元组使用数组的方法,比如使用 push 时,不会有越界报错
let tuple: [number, string] = [18, 'lin']
tuple.push(100) // 但是只能 push 定义的 number 或者 string 类型
push 一个没有定义的类型,报错
never 类型
never类型表示的是那些永不存在的值的类型。
有些情况下值会永不存在,比如,
如果一个函数执行时抛出了异常,那么这个函数永远不存在返回值,因为抛出异常会直接中断程序运行。 函数中执行无限循环的代码,使得程序永远无法运行到函数返回值那一步。
// 异常
function fn(msg: string): never {
throw new Error(msg)
}
// 死循环 千万别这么写,会内存溢出
function fn(): never {
while (true) {}
}
never 类型是任何类型的子类型,也可以赋值给任何类型。
没有类型是 never 的子类型,没有类型可以赋值给 never 类型(除了 never 本身之外)。即使 any也不可以赋值给 never 。
let test1: never;
test1 = 'lin' // 报错,Type 'string' is not assignable to type 'never'
let test1: never;
let test2: any;
test1 = test2 // 报错,Type 'any' is not assignable to type 'never'
any
不清楚用什么类型,可以使用 any 类型。这些值可能来自于动态的内容,比如来自用户输入或第三方代码库
let notSure: any = 4
notSure = "maybe a string" // 可以是 string 类型
notSure = false // 也可以是 boolean 类型
notSure.name // 可以随便调用属性和方法
notSure.getName()
==不建议使用 any,不然就丧失了 TS 的意义。==
unknown
不建议使用 any,当我不知道一个类型具体是什么时,该怎么办?
可以使用 unknown 类型
unknown 类型代表任何类型,它的定义和 any 定义很像,但是它是一个安全类型,使用 unknown 做任何事情都是不合法的。
比如,这样一个 divide 函数,
function divide(param: any) {
return param / 2;
}
把 param 定义为 any 类型,TS 就能编译通过,没有把潜在的风险暴露出来,万一传的不是 number 类型,不就没有达到预期了吗。
把 param 定义为 unknown 类型 ,TS 编译器就能拦住潜在风险,
function divide(param: unknown) {
return param / 2;
}
因为不知道 param 的类型,使用运算符 /,导致报错。
再配合类型断言,即可解决这个问题
function divide(param: unknown) {
return param as number / 2;
}
void
void类型与 any 类型相反,它表示没有任何类型。
比如函数没有明确返回值,默认返回 Void 类型
function welcome(): void {
console.log('hello')
}