TypeScript 中令人迷惑的物件型別:Object、{}和 object
Object
、 {}
和 object
,這三個表示物件的型別很容易讓人迷惑,下面來總結一下它們的聯絡和差異。
Object
Object
是 Object.prototype
的介面定義。原始碼中定義如下:
interface Object { constructor: Function; toString(): string; toLocaleString(): string; valueOf(): Object; hasOwnProperty(v: PropertyKey): boolean; isPrototypeOf(v: Object): boolean; propertyIsEnumerable(v: PropertyKey): boolean; }
JS 中所有物件的原型鏈預設都繼承自 Object.prototype
,原始值有包裝型別。所以 number
、 string
、 boolean
、 symbol
、物件和函式都可以賦值給 Object
型別。
{}
在 JS 中 {}
表示沒有自身屬性的字面量物件。但在 TS 中 {}
型別表示物件型別,能賦值給 Object
型別的值給都可以賦值給 {}
型別。但是這兩種型別還是有區別的,賦值給 Object
型別的物件必須嚴格滿足 Object.prototype
介面定義,而賦值給 {}
型別則無此限制。如下:
// toString() 必須嚴格滿足 Object.prototype.toString() 的定義,返回 string 型別。 // 這裡會報錯:Type '() => number' is not assignable to type '() => string'. let a: Object = { toString() { return 1; } }; let b: {} = { toString() { return 1; } };
object
為表示非原始值型別的物件,TypeScript 2.2 中引入了 object
型別。除了 number
、 string
、 boolean
、 symbol
、 null
和 undefined
, 其他所有型別都可以賦值給 object
型別。所以按照 TS 的建議,當我們需要表示物件時,用 object
就好,基本可以不用 Object
和 {}
了。
object
is not Object
. Always
use object
!
我的 JS 部落格:小聲比比 JavaScript
「其他文章」
- 產品說明丨Android端使用MobPush快速整合方法
- 不要在 Python 中使用迴圈,這些方法其實更棒!
- 分享 6 個 Vue3 開發必備的 VSCode 外掛
- 微服務架構的外部 API 整合模式
- 前端該如何優雅地 Mock 資料
- 記一次springboot專案結合arthas排查ClassNotFoundException問題
- 使用Vue.js編寫命令列介面,前端開發CLI的利器
- 升級Spring Cloud最新版後,有個重要的元件被棄用了!
- 微服務架構的通訊設計模式
- 視覺化拖拽元件庫一些技術要點原理分析(四)
- 我做了一個線上白板(二)
- 3 款非常實用的 Node.js 版本管理工具
- 636. 函式的獨佔時間 : 簡單棧運用模擬題
- Flutter 的 6 個最有用的 VS Code擴充套件
- TCP 學習筆記(三) 可靠傳輸
- 一文讀懂微服務架構的分解設計
- Python中常用最神祕的函式! lambda 函式深度總結!
- 從-99打造Sentinel高可用叢集限流中介軟體
- 技術分享| 小程式實現音影片通話
- Birdseye 極其強大的Python除錯工具