成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

TS中關于void類型的奇怪現象,你知道嗎?

開發 前端
在TS中有一種類型為void ,它表示的是空,但是需要注意的是它與JS中的空并不是一回事。并且它一般用于給函數返回值聲明類型 ,雖然也可以把一個變量的類型聲明為void,但我們一般不會這么干,因為沒有意義,為什么這么說呢?在下面的例子中來解答這個問題

前言

在TS中有一種類型為void ,它表示的是空,但是需要注意的是它與JS中的空并不是一回事。

并且它一般用于給函數返回值聲明類型 ,雖然也可以把一個變量的類型聲明為void,但我們一般不會這么干,因為沒有意義,為什么這么說呢?在下面的例子中來解答這個問題。

void類型

給變量聲明void類型

let name: void // 聲明一個變量name,類型為void

name = 'nanjiu' // 報錯 不能將類型“string”分配給類型“void”。
name = 18 // 報錯 不能將類型“number”分配給類型“void”。
name = null // 報錯 不能將類型“null”分配給類型“void”。
name = undefined // 正常

圖片圖片

也就是說當類型為void時,它能夠接受的值就只有一個:undefined,其它任何值都不行。

現在是不是能夠解釋為什么我們一般不會給變量聲明為void類型了,因為它的值只能是undefined,而undefined在我們實際開發時并沒有任何意義。

函數返回值聲明為void類型

顯式返回

當給函數返回值類型申明為void時,我們可以在函數中return一個undefined

function sayHello(): void {
  console.log('hello')
  return undefined
}

const str = sayHello()
console.log(str) // undefined

除undefined之外,return其它任何值都不可以。

隱式返回

在JS中,當我們沒有在函數中顯式地返回一個值時,它也會有一個隱式的返回值,而這個返回值恰好就是undefined,也就是說下面這種寫法也是合理的

function sayHello(): void {
  console.log('hello')
}

const str = sayHello()
console.log(str) // undefined

不應該依賴void值

void還有一個特點就是,調用者不應該依賴該返回值進行任何操作!!!

比如:

let name: void // 聲明一個變量name,類型為void
// 函數返回值類型為void
function sayHello(): void {
  console.log('hello')
}
// 函數返回值類型為void,值為undefined
const str = sayHello()
console.log(str) // undefined

// 報錯 無法測試 "void" 類型的表達式的真實性。
if(str) {
  console.log('str存在')
} else {
  console.log('str不存在')
}

圖片圖片

此時你會發現,vscode直接報錯了,void在TS中的含義就是空,表示什么也沒有,你就不應該使用它來進行任何操作。

總結

  • void一般用來聲明函數返回值的類型,它的含義為空,它能夠接受的值只有一個:undefined
  • 我們不應該依賴void類型的返回值進行任何操作

其實很簡單,總結來說就兩點,但是下面的例子你可能會有點吃驚...

type

簡單介紹一下type,它是TS中創建自定義類型的一個關鍵字。它可以為任意類型創建別名,方便進行類型復用與擴展

比如:

// 創建一個自定義類型,可以是字符串或者數字
type strOrnum = string | number

// 聲明一個變量,類型為 strOrnum
let str: strOrnum
str = 'nanjiu' // 可以賦值為字符串
str = 18  // 也可以賦值為數字

當然type還有很多強大的功能:聯合類型、交叉類型等。本文暫不介紹,我們來看一個有趣的問題:

為函數聲明類型

// 創建一個函數類型,參數為string類型,返回值為void
type say = (name: string) => void

// 定義一個函數,類型為say
let sayHello: say = (name: string) => {
  console.log(`hello ${name}`)
}

sayHello('nanjiu')

上面通過type創建了一個函數類型:該函數有一個參數,并且參數類型為string。函數的返回值類型為void

函數返回非undefined值

從上面void的介紹中,我們可以確定該函數的返回值只能為undefined(顯式隱式都可以)。

但是此時卻不是這樣了,你給它返回任何值都可以...

// 創建一個函數類型,參數為string類型,返回值為void
type say = (name: string) => void

// 定義一個函數,類型為say
let sayHello: say = (name: string) => {
  console.log(`hello ${name}`)
  return null
}

const res = sayHello('nanjiu')
console.log(res) // null

為什么會這樣?

上面這個例子是不是違背了當初void的定義,難道這是TS的bug嗎?

其實并不是的,官方的解釋是:

是為了確保如下代碼成立,我們知道Array.prototype.push的返回值是一個數字,而Array.prototype.forEach方法期望其回調的返回類型是void

const arr = [1, 2, 3, 4, 5]
const list = [0]

arr.forEach(item => list.push(item))
console.log(list)

圖片圖片

紅色框圈出來的是forEach的回調函數的類型定義,也就是item => list.push(item)

它也就相當于是使用type進行的自定義類型聲明

type callbackfn = (value: number, index: number, array: number[]) => void

該函數的類型定義為,有三個參數,前兩個類型均為number,第三個參數為全為number類型的數組,函數返回值類型為void

由于我們的回調函數使用的是箭頭函數的簡寫形式,該簡寫形式相當于會return list.push(item),并且push方法又是有返回值的

item => list.push(item)

等同于

item => {
  return list.push(item)
}

等同于

item => {
  return 2
  
  // return 3
  // return 4
  // ...
}

那也就是說該函數的返回值類型變成了number,不符合void的類型定義。

所以TS官方為了讓我們能夠使用這種簡寫形式,才有了這一現象。

使用類型聲明限制函數返回值為void時,TS并不會嚴格要求函數返回空

否則的話這種場景我們就只能這樣寫了:

arr.forEach(item => {
  list.push(item)
})
// 或者
arr.forEach(function(item) {
  list.push(item)
})

但需要注意的是,盡管使用類型聲明限制函數返回值為void時,TS并不會嚴格要求函數返回空,但我們還是不能依賴其返回值進行任何操作

// 創建一個函數類型,參數為string類型,返回值為void
type say = (name: string) => void

// 定義一個函數,類型為say
let sayHello: say = (name: string) => {
  console.log(`hello ${name}`)
  return name
}

const res = sayHello('nanjiu')
console.log(res) // nanjiu

if (res) {
  console.log('res')
}

責任編輯:武曉燕 來源: 前端南玖
相關推薦

2021-02-24 15:20:43

Windows 10Python命令

2022-05-09 10:47:08

登錄SpringSecurity

2020-02-20 08:30:49

OSPF網絡協議路由協議

2021-09-19 22:53:48

5G4G手機

2015-06-29 09:06:51

2019-01-07 13:01:08

Linux驚嘆用法命令

2023-04-26 10:06:08

RocketMQ屬性Consumer

2022-01-26 22:14:59

HiveSQLSQL腳本

2024-06-03 14:27:08

ThisAPIThat

2016-03-18 19:03:35

認知計算IBM

2018-09-12 11:18:56

finalJava用法

2023-12-12 08:41:01

2021-03-19 18:13:21

手機內存軟件

2019-12-12 09:23:29

Hello World操作系統函數庫

2022-03-10 08:25:27

JavaScrip變量作用域

2024-09-18 07:00:00

消息隊列中間件消息隊列

2021-10-14 06:52:47

算法校驗碼結構

2022-09-29 15:32:58

云計算計算模式

2021-03-02 08:49:00

區塊鏈比特幣技術

2023-12-20 08:23:53

NIO組件非阻塞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 波多野结衣先锋影音 | www九色 | 一区二区三区亚洲 | 视频在线观看一区 | 狠狠入ady亚洲精品经典电影 | 99精品国产一区二区青青牛奶 | www国产成人免费观看视频,深夜成人网 | 日韩不卡在线 | 日韩精品视频中文字幕 | 国产高清精品一区二区三区 | 国产成人精品a视频一区www | 九热在线| 久久国产综合 | 亚洲精品电影在线观看 | 色伊人| 日韩精品在线一区 | 久久中文字幕一区 | 欧美日韩毛片 | 久久久久中文字幕 | 久久久久国产精品午夜一区 | 成人超碰 | 中文一区 | 久久亚洲视频 | 国产1区2区 | 成人欧美一区二区 | 网站国产| 精品99久久 | 久久爱一区 | 日韩一级精品视频在线观看 | 色婷婷综合久久久中字幕精品久久 | 乳色吐息在线观看 | 午夜丰满少妇一级毛片 | 国产1区2区| 二区国产 | 综合精品久久久 | 中文字幕的av | 超碰导航| 亚洲精品一区二区网址 | 黄视频免费在线 | 日本视频免费观看 | 中文字幕在线观看一区二区 |