- #100
- #99
- #98
- #97
- #96
- #95
- #94
- #93
- #92
- #91
- #90
- #89
- #88
- #87
- #86
為什麼 TypeScript 中 Object.keys 接受任何物件都只返回 string[] 型別?
如圖中錯誤訊息得知
person
會需要接受特定值的key
而非任意string
,那背後麼又是什麼原因Object.keys
被設計成返回更為鬆散的string[]
型別呢?明明很明顯可以透過keyof
得出所有key
的型別?因為 JavaScript 物件可以 「在執行時動態改變其內容」。
如果將
Object.keys
設計成返回(keyof T)[]
,該型別定義無法準確反映 JavaScript 物件在運行時可能遭遇的變化,因為物件屬性可以被動態修改,所以 TypeScript 選擇使用更寬鬆的string[]
型別來確保安全。結論: TypeScript 尊重 JavaScript 動態型別的特性,導致 Object.keys 最多只能確保返回
string[]
型別。分析細節與引用參考還有三種應對方式寫在部落格中:為什麼 TypeScript 中 Object.keys 返回 string[] 型別?
- #85
- #84
- #83
- #82
- #81
- #80
- #79
- #78
- #77
- #76
- #75
- #74
- #73
- #72
- #71
- #70
- #69
- #68
- #67
- #66
- #65
- #64
- #63
- #62
- #61
- #60
- #59
- #58
- #57
- #56
- #55
- #54
- #53
- #52
- #51
- #50
- #49
- #48
- #47
- #46
- #45
- #44
- #43
- #42
- #41
- #40
- #39
- #38
- #37
- #36
- #35
- #34
- #33
- #32
- #31
- #30
- #29
- #28
- #27
- #26
- #25
- #24
- #23
- #22
- #21
- #20
- #19
- #18
- #17
- #16
- #15
- #14
- #13
- #12
- #11
- #10
- #9
- #8
- #7
- #6
- #5
- #4
- #3
- #2
- #1