1

選項基於這個問題Multiple arguments vs. options object參數VS在打字稿

我想知道如何這確實適用於打字稿。我想作出如下決定:

的利弊我現在發現:

  • 打字稿可以處理可選參數相當不錯,但依靠參數的數量級,並具有參數一個長長的清單是不是我查找方便。

  • 使用option對象很不錯,但需要爲每個對象(?)創建一個接口,根據我的理解,這會導致代碼重載,而我不知道會生成哪種文檔/提示。

+0

我不確定你的意思是「重載代碼」,而是一個選擇接口離子對象只是一個好習慣。如果你沒有,你可能會寫一個大塊的評論來解釋它。 – thoughtrepo

+0

「重載代碼」我的意思是描述單個選項對象的接口的一大塊代碼。 –

回答

3

在我看來,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)); 

即使我們原本打算dateToSendnew Date(2015, 9, 20),現在是new Date(),也許我們不希望dateToSendnew 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) 
}); 

建議

我的建議是:

  1. 使用多個參數時,有沒有太多,你可以易懂通過查看函數名稱找出每個參數的含義。
  2. 否則使用具有屬性的對象。
  3. 如果它們可讀,將這兩者混合在一起即可。

對象屬性文檔

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) 

然後使用它的時候,你可以看到在代碼完成註釋:

Message options code completion

+0

很好,在大多數情況下,我只會將可選參數放入選項對象中。現在TS能夠評論一個對象的屬性來給出提示嗎? F.E. */@正文消息的內容/ *? –

+1

@FlavienVolken它不適合我。我在答案中添加了「對象屬性文檔」一節,並提供了更多詳細信息。 –

+1

在這種情況下,我只會創建一個接口,並對所述接口的屬性進行評論。您可以直接將JSDoc註釋放入參數列表中,但它必須位於多行,並且看起來很難看。 – thoughtrepo