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