打字稿中可选参数的语义

时间:2020-07-09 14:22:23

标签: typescript

作为其他代码的用户,我希望能够查看一个函数并根据类型是否可选来确定所需的内容。

例如:

function doSomething(required: string, optional?: string)

但是作为一个正在编写供他人使用的代码的开发人员,我仍然想表示一个参数是必需的,但是我希望进行类型检查,好像它不是必需的,因为我不能保证最终用户也正在使用打字稿,我想妥善处理错误的论点。

可以吃我的蛋糕吗?如果我不检查或处理未定义的参数,是否可以将参数表示为非可选参数,但仍然会出现编译错误?

?: string: string | undefined之间存在语义差异

还是仅对所有必填字段都具有先决条件的解决方案?

2 个答案:

答案 0 :(得分:2)

可以在调用中省略可选参数。尽管您可以传入T | undefined

,但仍必须存在键入为undefined的必需参数。
function doSomething(required: string, optional: string | undefined) {

}

doSomething("") // error in TS
doSomething("", undefined) 

Playground Link

如果用户不使用Typescript,那么这都不重要,因为用户无论如何都可以传递更少的参数。

function doSomething(required: string, optional: string) {

}

doSomething("") /// Bad in ts, but fine in JS

Playground Link

答案 1 :(得分:0)

如果即使需要所需的值也要记住处理未定义的情况,那么您可以重铸传递的参数,并且打字稿会在编译时对您大喊大叫,而不检查此重铸的值是否未定义

在下面的示例中,我在函数内部使用了as string | undefined,对于该函数的用户,他们将看到所有参数都是必需的,但您仍然会感到防御。

  function doSomthingElse(requiredString1: string, requiredString2: string) {}

  function doSomething(required: string, required2: string) {
    const recasted = required2 as string | undefined

    doSomthingElse(required, recasted) //TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string
  }