TS基本类型使用

91 阅读3分钟

基础类型

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')
}