在基礎類型(一)中我們說了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
```