Typescript中的参数与选项

Typescript中的参数与选项,typescript,arguments,parameter-passing,documentation-generation,Typescript,Arguments,Parameter Passing,Documentation Generation,基于这个问题, 我想知道这是如何应用于Typescript的。我想做出一个决定,以便: 预编译器/lint给出的提示将尽可能相关 房间也将尽可能干净 我现在发现的利弊: Typescript可以很好地处理可选参数,但依赖于参数的顺序和一长串参数并不是一件方便的事情 使用选项对象很好,但需要为每个对象创建一个接口(?),据我所知,这会使代码过载,我不知道会生成哪种文档/提示 在我看来,同样的情况仍然适用于打字脚本。不要依赖IDE来提示代码的功能。最好让代码告诉您它的功能 参数越多,代码的可读

基于这个问题,

我想知道这是如何应用于Typescript的。我想做出一个决定,以便:

  • 预编译器/lint给出的提示将尽可能相关
  • 房间也将尽可能干净
我现在发现的利弊:

  • 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())
      
      现在我们知道了第三个参数是什么,但是即使我们使用的是TypeScript,我们仍然需要做一些调查并查看函数签名。或者,我们可以将鼠标移到函数调用上,让开发环境告诉我们,但这仍然不理想

      太多的参数会使更改变得困难并增加出错的机会

      现在假设我们想添加一个新的必需日期参数,名为
      datetosendreach
      。我们的函数签名更改为:

      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
      设为
      新日期(2015,9,20)
      ,但现在是
      new Date()
      ,也许我们不希望
      dateToSend
      设为
      新日期(2015,9,20)

      改用具有属性的对象

      我们可以通过让原始函数签名使用具有属性的对象(注意,不需要接口)来解决所有这些问题:

      所以我们的原始代码应该是这样的:

      sendMsg({
          title: "Poem", 
          body: "I sing of brooks, of blossoms, birds and bowers.", 
          dateToSend: new Date(2015, 9, 20)
      });
      
      …这很容易快速理解正在发生的事情

      此外,当我们添加
      datetosendreach
      时,这将非常容易,我们会得到一个编译错误,通知我们使用新的必需属性更新所有函数调用:

      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)
      });
      
      建议

      我的建议是:

    • 如果没有太多参数,可以使用多个参数,并且通过查看函数名可以理解每个参数的含义
    • 否则,请使用具有属性的对象
    • 如果可读的话,把这两个混合在一起是可以的
    • 对象属性文档

      用于代码完成,因此您可以使用此语法记录对象的属性。阅读如何记录它

      不幸的是,在VisualStudio2013的TS 1.6代码完成中,这似乎没有给出对象属性的描述

      不过,使用界面似乎是可行的:

      /**
       * The options for sendMsg
       */
      interface SendMsgOptions {
          /**
          * The title of the message
          */
          title: string;
          // etc...
      }
      
      更改函数标题:

      function sendMsg(options: SendMsgOptions)
      
      然后,当使用它时,您可以在代码完成中看到注释:


      我不确定您所说的“重载代码”是什么意思,但选项对象的接口只是一种很好的做法。如果你不这样做,你可能会写一个大的块注释来解释它。通过“重载代码”,我指的是一个大的代码块来描述单个选项对象的接口。很好,在大多数情况下,我只会将可选参数放入选项对象中。现在TS能够注释对象的属性以给出提示了吗?F.e./@body您邮件的内容/?@FlavienVolken我不知道。我在答案中添加了“对象属性文档”一节,并提供了更多详细信息。如果是这样的话,我会制作一个接口,并对所述接口的属性进行注释。您可以将JSDoc注释直接放在参数列表中,但它必须在多行上,而且看起来很难看。@thoughterpo我同意。顺便说一句,你能举个简单的例子说明如何注释接口的属性吗?我确实考虑了
      @param{string}employee.name-员工的名称。
      但这意味着我必须手动指定参数的类型(在注释中),而不是使用参数本身的类型。显然,我更喜欢代码显式地在文档中生成正确的类型。好的,看起来在属性定义之前只有/**您的描述*/。非常感谢@弗莱文沃肯是的,只是那样。无论如何,我已经继续更新了这篇文章。
      function sendMsg(options: SendMsgOptions)