3、TS_类型(字面量、联合类型、any(显示与隐式)、unknown、void 和 never)

98 阅读3分钟

类型

类型例子描述
number-1 , 0 , 1...任意数字
string'hello' , 'good'...任意字符串
booleantrue , false布尔值 true 或 false
字面量其本身限制变量的值就是该字面量的值
any*任意类型
unknown*类型安全的any
void空值 ( undefined )没有值 或 undefined
never没有值不能是任何值
object{name:'David',age:13}任意的 JS 对象
array[1,2,3]任意的 JS 数组
tuple[4,5]元素,TS新增类型,固定长度数组
enumemun {A,B}枚举, TS中新增类型

字面量

let a:10 = 10

let b:10 = 11   //不能将类型“11”分配给类型“10”

现在我们将 10 这个字面量当做[类型]分配给 变量 a、b,这时候,a和b的值只能为 10,如果赋值为其他的值,就会报错。 那这个字面量有什么用呢?

联合类型( 可以使用 | 来连接多个类型 )

//可以使用 | 来连接多个类型(联合类型)
let gender:'male' | 'female'

gender = "male"
gender = "female"

let c:boolean|string
c = false
c = "hello"

像上面这样的情况,设置 gender 只能是 'male' 或 'female' ,便可以很好的控制 gender的值。


any( 表示的是任意类型,对一个变量设置类型为any后,相当于对该变量关闭了TS的类型检测 )

使用TS时,不建议使用 any 类型

let a:any

a = 10  //可以
a = "hello"  //可以
a = true   //可以

显示与隐式

声明变量如果不指定类型,则TS解析器会自动判断变量的类型为 any (隐式的any)

let d:any   //any  (显示)
let x      // any  (隐式)

unknown(表示未知类型的值)


let a: unknown;
a = 10; //可以
a = "hello"; //可以
a = true; //可以

不对啊?这不和any是一个样了吗?好像它们都没有类型,那我们来看看它们的区别吧

unknown 和 any 的区别

any:类型为any的变量,可以赋值给任意变量
unknown:不可以

let a: unknown;
let b: any;
let c: string;

c = b; //可以
c = a; //不能将类型“unknown”分配给类型“string”

unknown 有意思的是,下面这样的赋值也不可以

let a: unknown;
let c: string;

a = "hell0";
c = a; //不能将类型“unknown”分配给类型“string”

按理来说,a都已经赋值为string,为啥还报错呢?

因为TS检测时,看的不是值,而是类型。而a的类型为unknown,所以还是会报错

其实,unknown就是一个类型安全的any,unknown类型的变量不能直接赋值给其他变量

那如何解决上面这种问题呢?下面提示几种方式

let a: unknown;
let c: string;

//第一种
if (typeof a === "string") {
  c = a;   //可以
}

//第二种
/* 类型断言(告诉解析器变量的实际类型)
* as string:断言 a 的类型就是为 string 类型
* <string>a; 断言 a 的类型就是为 string 类型
* 这两种语法都可以
*/ 
c = a as string
c = <string>a;

void 和 never

void: 用来表示空,以函数为例,就表示没有返回值的函数(如果不显示声明,TS也会自动推断返回值类型)

function handleName():void{
  return  //可以
  
  return undefined  //可以
  
  return null //不能将类型“null”分配给类型“void”
}

never: 没有值(表示不会有返回结果)

function handleName():never{
  return            //不能将类型“undefined”分配给类型“never”
  return undefined  //不能将类型“undefined”分配给类型“never”
  return null       //不能将类型“null”分配给类型“void”
}

//注意,这种不写 return 的也会报TS错误
function handleName2():never{

}

其实 never 这种返回值,往往用在报错的函数中

function handleName2(): never {
  throw new Error("名称解析错误,请检查格式");    //可以
}