【问题标题】:How to know when to create an interface vs. defining an object directly in the function signature in Typescript?如何知道何时创建接口与直接在 Typescript 的函数签名中定义对象?
【发布时间】:2021-01-12 05:11:33
【问题描述】:

编写 Typescript 函数的标准方法是什么?例如,以下三个哪个是理想的:

// 1
function myFunction (a: string) {}

// 2
function myFunction ({ a }: { a: string }) {}

// 3
interface IMyFunction {
  a: string
}

function myFunction (input: IMyFunction) {}

例如,如果有 3 个变量,答案是否会改变?

这些类型的问题是否有很好的参考文档?

【问题讨论】:

  • 您的参数是否使用内联类型或类型别名(示例 2 与示例 3)将取决于很多因素(类型的复杂性,是否在任何地方重用等)。但是您应该知道示例 1 与示例 2 和 3 具有不同的签名。一个取一个字符串,另一个取一个对象。如果要使用哪些取决于您希望如何设计您的 API。一般来说,我认为如果一个函数接受一个对象,那么将这个对象定义为它自己的接口通常是一个好主意。但是对于重用最少的简单案例,示例 2 可以正常工作。

标签: typescript function interface


【解决方案1】:

这些都不是理想的,也没有针对此类问题的文档,因为这完全由您决定。这就像争论是否需要在 JavaScript 中的每行末尾写分号:我不写,但很多人都这样做,这没问题。

作为一般规则,使用简单的参数可能会更好,当它们的目的很明显时,例如Math.sqrt 需要一个数字,并且很明显,为什么以及它用它做什么。论证效果最好的其他示例是:

function getUserById(id: number) { /* ... */ }
getUserById(12523)

function displayMessage(text: string) { /* ... */ }
displayMessage('Hello')

同样,没有人禁止您使用对象和接口,只是在这些示例中,参数的含义很明显,而且数量不多。

看看这个函数:

function getUserById(id: number, includeDescription: boolean) {}

在这种情况下,您可能希望使用对象而不是普通参数,因为如果我写getUserById(12345, true),除非您记得您是如何编写此函数或查看它的定义,否则您不清楚true 的含义。所以你可以这样写

function getUserById({ 
  id, 
  includeDescription 
}: {
  id: number,
  includeDescription?: boolean
}) {}

这完全没问题,除非您在其他地方使用此对象类型。如果你这样做了,那么你可能想写一个接口或一个类型别名,这样你以后就不必重复你的代码了。就我个人而言,我通常会写类型别名,因为当你在编辑器中将鼠标悬停在使用接口声明的参数上时,它只显示接口的名称,但使用类型别名,它会显示整个对象定义,所以这样更快

type GetUserByIdOptions = {
  id: number
  includeDescription?: boolean
}
function getUserById({ id, includeDescription }: GetUserByIdOptions) {}

通常如果你有很多参数(比如超过 3 个),那么你会想要使用对象,因为这样更容易记住这些参数是什么。此外,您不必记住他们的订单。但同样,这完全取决于您,只要写出对您来说更好看的东西和您的感觉。

【讨论】:

  • 谢谢!这句话真的让我明白了:“这就像在争论是否需要在 JavaScript 中的每一行末尾写分号”
猜你喜欢
  • 2012-10-20
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2017-07-02
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多