类型
| 类型 | 例子 | 描述 |
|---|---|---|
| number | -1 , 0 , 1... | 任意数字 |
| string | 'hello' , 'good'... | 任意字符串 |
| boolean | true , 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新增类型,固定长度数组 |
| enum | emun {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("名称解析错误,请检查格式"); //可以
}