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

As Const:一個被低估的 TypeScript 特性

開發 前端
你有沒有感覺 TypeScript中可能有一些被低估但卻非常有用的工具,你并沒有充分利用?的確有,今天我們要重點介紹一個:As const。它雖然沉默卻強大,而且非常有力,是一個被低估的功能,但它的力量卻強大無比。

你有沒有感覺 TypeScript中可能有一些被低估但卻非常有用的工具,你并沒有充分利用?的確有,今天我們要重點介紹一個:as const。它雖然沉默卻強大,而且非常有力,是一個被低估的功能,但它的力量卻強大無比。

理解 'as const'

以下是一個沒有 as const 的代碼片段:

const menu = {
    home: '/home',
    about: '/about',
    contact: '/contact'
};

這個TypeScript的世界里,這個變量可以隨心所欲地變化和改變。聽起來很靈活,,但是這里有個陷阱。

請考慮這個 go to root 方法:

function goTo(route: 'home' | 'about' | 'contact') {
    // some implementation
}

注意到了嗎?如果你在 menu 對象中添加了另一條路由,你也需要更新函數 goTo 。這就是冗余,導致同一類型有多個真實來源。

as const 可以為我們解決這個問題。

TypeScript的期望與現實

當你在使用TypeScript時,有時你所期待的和實際發生的情況會痛苦地產生巨大的分歧。當我們試圖從現有的類型中創建一個新的類型時,這種分歧變得非常明顯。

這里有個例子。假設你有一個對象,你期望TypeScript只考慮這個對象的屬性。但是,意外的是!TypeScript只把它當作一個字符串來考慮。

let route: keyof typeof menu;
route = 'store'; // No error

在這種情況下,TypeScript認為 route 是一個可能會發生變化的字符串。但是,我們希望基于屬性的固定類型。我們的期望和現實并未對齊。

解決方案:'as const'

我們剛剛經歷的那種痛苦的分歧,就是 as const 試圖解決的問題。通過將易變屬性改為不變屬性, as const 使我們的期望與現實保持一致。

const menu = { 
  home: '/home', 
  about: '/about', 
  contact: '/contact' 
} as const;

通過這個簡單的改變,我們的對象屬性變成了只讀。我們看看它如何影響我們之前的問題:

let route: keyof typeof menu; 
route = 'store'; // Error. Exactly what we wanted!

通過使用 as const 使對象變為不可變,TypeScript 現在明白 route 應該只允許提供的鍵。現在,我們得到了我們想要的確切結果:當我們試圖設置無效值時,會出現類型錯誤。

與 object.freeze 的比較

你可能對JavaScript方法 Object.freeze() 有所了解。 Object.freeze() 和 as const 都可以使對象只讀,但它們之間存在著關鍵的差異。

我們快速了解一下他們的能力:

const menuFrozen = Object.freeze({
    home: '/home',
    about: '/about',
    contact: '/contact'
});

const menuConst = {
    home: '/home',
    about: '/about',
    contact: '/contact'
} as const;

以及一些結果:

// 這不會改變任何東西,home 仍然是'/home'
menuFrozen.home = '/newHome';

// 編譯時錯誤
menuConst.home = '/newHome';

通過 Object.freeze() ,我們擁有了一個運行時概念,可以防止JavaScript對象的更改。然而, Object.freeze() 并不影響 TypeScript 的類型推斷。

另一方面,有了 as const ,TypeScript在編譯時將對象視為不可變的,使你的類型檢查更為嚴格,這有助于捕捉更多可能的錯誤。

因此,雖然 as const 和 Object.freeze() 在表面上看起來可能相似,但它們服務于不同的目的。 as const 在類型檢查上更為強大,而 Object.freeze() 只在運行時強制實施不變性。

一個配合 'as const' 的更清潔的 'go to root' 函數

我們使用 as const 重構 goTo 函數:

function goTo(route: keyof typeof menu) {    
  // some implementation
}

就這樣,as const 使我們免于重復信息的愚蠢操作。我們可以從我們創建的對象中推斷出一個類型。這樣是不是更簡潔了?

使用 'as const' 提取對象值

我們使用 as const 提取我對象值,顛覆TypeScript的規則,獲取我們需要的所有詳細信息,以編寫強大且無bug的代碼。這只需要一點類型魔法。

以下是一個示例:

type Routes = typeof menu[keyof typeof menu]; 
// Routes is now equal to '/home' | '/about' | '/contact'

責任編輯:姜華 來源: 大遷世界
相關推薦

2013-06-28 17:28:04

推送

2021-05-21 07:26:15

DataSource接口數據庫

2024-12-13 08:02:10

PythonGenerator懶加載

2023-01-16 18:16:49

CinnamonLinux桌面環境

2016-01-27 13:40:12

IBM Watson/

2025-05-15 00:01:00

2023-02-14 07:50:30

Python模塊

2020-07-13 07:27:16

Python開發

2020-10-04 11:34:28

JavaScript開發技術

2021-04-21 09:19:44

裝飾器Python

2024-06-06 10:13:04

2024-12-03 16:39:41

2022-11-10 08:31:09

原生圖數據庫可視化

2023-01-12 08:47:26

二項式楊輝斐波那契

2009-12-21 10:05:00

2024-01-03 14:07:06

技術ChatGPTIT

2012-06-13 01:05:53

JavaRubyJVM

2022-04-08 08:48:16

線上事故日志訂閱者

2024-04-02 09:42:39

2025-03-25 09:20:00

NPM庫開發代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久一区二区三区 | 九九99九九精彩46 | 日韩福利在线观看 | 91av视频在线免费观看 | 成人在线视频看看 | 日韩国产三区 | 亚洲精品美女在线观看 | 欧美一区二区大片 | 欧美一区二区三区精品免费 | 伊人天堂网 | 每日在线更新av | 午夜免费福利影院 | 日韩在线精品视频 | 久久综合香蕉 | 亚洲av毛片| 无码国模国产在线观看 | 男女深夜网站 | 亚洲欧美中文日韩在线 | 国产在线播放一区二区三区 | 亚洲一区二区三区四区五区午夜 | aa级毛片毛片免费观看久 | 国产在线看片 | av中文字幕网站 | 日本久草| 精品一区久久 | a在线观看 | 亚洲综合色视频在线观看 | 国产精品免费一区二区三区四区 | 日韩视频一区在线观看 | 国产成人精品久久二区二区91 | 一区二区三区免费 | 中文字幕一区二区三区四区五区 | 午夜国产 | 黄色片av| 欧美在线一区视频 | 亚洲精品视频在线看 | 人人鲁人人莫人人爱精品 | 91色站| 日本中出视频 | 欧美夜夜| 久久久久久久97 |