javascript - 如何在 componentDidMount 中使用 typescript 設置只讀屬性?
我希望在 React.Component 類中擁有常數(只讀)屬性。問題是我不應該在建構函數中初始化它們,因為它們會觸發副作用,例如 setInterval 或 fetch。相反,我應該在 componentDidMount 中初始化它們,但由於我使用嚴格的類型檢查,我還必須指出它們的類型可以是 undefined(或者 null,隨便)。這正是我想避免的,因為那樣每次使用它們時我都被迫檢查值是否不為 null,儘管我已經知道它不為 null,而且我也想盡量避免使用 “!” 操作符,因為那樣當我忘記初始化它們時就不會有類型錯誤。
是否存在一個乾淨的解決方案?有沒有辦法告訴 TypeScript componentDidMount 就像是一個構造函數,因此屬性只能在那裡初始化?
答案#1
不,沒有乾淨的方法可以做到這一點。這是 TypeScript 對類別的理解所固有的,大致上類別有兩個區域 (忽略與問題無關的勘誤):
- 建構子:欄位及其支援型別被初始化的地方
- 類別的其餘部分:欄位被使用的地方——以及它們的支援類型不會改變
退一步來看:知道 componentDidMount 是一個初始化函數,有點像程式碼中的「隱性假設」。也就是說,它並不是 JavaScript 本身的一部分,程式碼中本身沒有任何東西能解釋它。這是你在使用 React 類別時應該知道的事情。類型系統沒有一個很好的工具來處理這個,是因為要在類型系統的範疇內描述每個框架魔法的細微差別是非常困難的。
必須記住這些隱含假設,是許多開發者轉向使用 React 函數組件的部分原因。他們不需要隨著時間改變屬性的類型——更多的是關於變數和作用域,這在類型系統中更為合適。