在我看來,TypeScript仍然適用。不要依賴IDE給你提示代碼的作用。最好讓代碼告訴你它做了什麼。
你的論點越少,讀你的代碼變得
看看下面的代碼:
sendMsg("Poem", "I sing of brooks, of blossoms, birds and bowers.", new Date(2015, 9, 20));
我們也許可以告訴大家,第一個參數是標題和第二個參數是身體,但第三個參數做什麼?這裏的日期意味着什麼?
我們來看看函數簽名上看到:
function sendMsg(title: string, body: string, dateToSend = new Date())
所以現在我們所知道的第三個參數是什麼,但即使我們使用的打字稿,我們仍然不得不做一些調查,看看函數簽名。或者,我們可以將鼠標移到我們的開發環境的函數調用上告訴我們,但這仍然不理想。
參數太多做出改變困難,並增加錯誤
現在說我們要添加一個名爲dateToSendAgain
新的必要日期參數的機會。我們的函數簽名更改爲:
function sendMsg(title: string, body: string, dateToSendAgain: Date, dateToSend = new Date())
有這方面的一個問題,就是我們原來的函數調用不拋出一個編譯錯誤和含義發生了變化:
// now creates a message with dateToSendAgain = new Date(2015, 9, 20)
// and dateToSend = new Date()
sendMsg("Poem", "I sing of brooks, of blossoms, birds and bowers.", new Date(2015, 9, 20));
即使我們原本打算dateToSend
爲new Date(2015, 9, 20)
,現在是new Date()
,也許我們不希望dateToSend
爲new Date(2015, 9, 20)
。
使用帶有屬性,而不是對象
我們可以通過使我們原來的函數簽名使用帶有屬性的對象已經解決了這一切(注意,不是必需的接口):
function sendMsg(options: { title: string; body: string; dateToSend?: Date; dateToSendAgain: Date; }) {
// we now have to define our default values here though...
// if we use destructuring it's not too bad:
const {title, dateToSend = new Date()} = options;
// ...rest of function body omitted...
}
所以我們的原始代碼看起來是這樣的:
sendMsg({
title: "Poem",
body: "I sing of brooks, of blossoms, birds and bowers.",
dateToSend: new Date(2015, 9, 20)
});
...這很容易快速和了解正在發生的事情。
此外,我們去的時候添加dateToSendAgain
,那將是非常容易的,我們會得到一個編譯錯誤,通知我們更新我們的所有功能與新的必需屬性要求:
sendMsg({
title: "Poem",
body: "I sing of brooks, of blossoms, birds and bowers.",
dateToSend: new Date(2015, 9, 20),
dateToSendAgain: new Date(2015, 10, 20)
});
建議
我的建議是:
- 使用多個參數時,有沒有太多,你可以易懂通過查看函數名稱找出每個參數的含義。
- 否則使用具有屬性的對象。
- 如果它們可讀,將這兩者混合在一起即可。
對象屬性文檔
TypeScript uses JSDoc代碼完成,所以你可以使用這個語法記錄對象的屬性。閱讀here關於如何記錄它。
不幸的是,這似乎並沒有給我描述在TS 1.6的Visual Studio 2013中的代碼完成中的對象屬性。
使用的界面看起來雖然工作:
/**
* The options for sendMsg
*/
interface SendMsgOptions {
/**
* The title of the message
*/
title: string;
// etc...
}
改變函數頭:
function sendMsg(options: SendMsgOptions)
然後使用它的時候,你可以看到在代碼完成註釋:
我不確定你的意思是「重載代碼」,而是一個選擇接口離子對象只是一個好習慣。如果你沒有,你可能會寫一個大塊的評論來解釋它。 – thoughtrepo
「重載代碼」我的意思是描述單個選項對象的接口的一大塊代碼。 –