在基础类型(一)中我们说了js中的基本类型在ts中对应的类型,除了那其中类型外,在ts中还有基本特殊的类型。
### **任意值**
任意值`any`表示不受类型系统的限制,可以被赋予任何类型的值
```javascript
// 声明字符类型
let str: string = 'string'
// 赋值其他类型的值 报错 Type '123' is not assignable to type 'string'.
str = 123
// 给any类型的变量赋值字符
let anyValue: any = '字符'
// 再修改值为数字也是可以的
anyValue = 123
```
任意值不仅可以被任意赋值,也可以被调用任何属性或者方法
```javascript
let arr: any = 12345
// 实际数值没有split方法,调用会出错,但是any类型不做类型检查,所以调用时没有提示语法错误
let spllit: any = arr.split(',')
```
在实际项目中,`any`一般在不知道值的类型的时候使用。在项目中应避免将typescript使用成anyscript, 使用typescript更多的就是利用它自身类型系统的优势。
### **unknown**
在ts3.0新引入了一个新的类型`unknown`, `unknown`与`any`一样,任何类型都可以赋值给`unknown`
```javascript
let unknownValue: unknown = 'string'
unknownValue = 123
```
但与`any`不同的是,如果没有给`unknown`明确指定类型,无法对`unknown`做任何操作
```javascript
let value: unknown = 'string'
// 报错 Object is of type 'unknown'
const val1: unknown = value.toLocaleLowerCase()
// 正确 在ts中可以通过 as 为变量指定类型
const val2: string = (value as string).toLocaleLowerCase()
// 也可以使用<string>value的方式自定类型,在React中不支持
const val3: string = (<string>value).toLocaleLowerCase()
```
建议对于未知类型的情况下优先使用`unknown`
### **void**
对于熟悉java的同学来说,`void`是特别常用的一个类型,表示没有任何返回值
```java
public static void main(String args []){
System.out.println('输出字符串');
}
```
在ts中,`void`的作用基本和java是一致的,如果一个函数或者方法没有返回值,那么它的返回值就是void
```javascript
function method(): void {
console.log('没有任何返回值')
}
```
如果给一个变量指定类型为`void`,那么这个变量的值只能是`undefined`或`null`
```javascript
let void1: void = undefined
let void2: void = null
// 报错 Type '123' is not assignable to type 'void'.
let void3: void =123
```
### **never**
`void`代表没有返回值,而`never`类型表示的是永不存在的值的类型,使用never常用的场景包括
* 函数抛出异常
* 函数内部出现死循环
```javascript
// 抛出异常
function error(message: string): never{
throw new Error(message)
}
// 死循环
function map():never {
while(true) {}
}
```
如果将一个变量指定类型为`never`,那么这个变量只能赋值`never`类型的值
```javascript
function error(message: string): never{
throw new Error(message)
}
let never1: never = error('异常信息')
// 报错 Type '1' is not assignable to type 'never'
let never2: never = 1
// 报错 Type 'null' is not assignable to type 'never'
let never3: never = null
// 报错 Type 'undefined' is not assignable to type 'never'.
let never4: never = undefined
// 报错 Type 'any' is not assignable to type 'never'
const anyValue: any = 1
let never5: never = anyValue
```