如何知道何时创建接口与直接在 Typescript 的函数签名中定义对象?

How to know when to create an interface vs. defining an object directly in the function signature in Typescript?

写Typescript函数的标准方式是什么?例如,以下三项中哪项是理想的:

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

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

// 3
interface IMyFunction {
  a: string
}

function myFunction (input: IMyFunction) {}

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

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

None 这些是理想的,没有针对这些类型问题的文档,因为这完全由您决定。就像争论是否有必要在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 个),那么你会想要使用对象,因为这样更容易记住这些参数是什么。你也不必记住他们的顺序。但同样,这完全取决于您,只要写您觉得更好的东西和您喜欢的东西即可。