Javascript 在Typescript中将函数参数定义为对象

Javascript 在Typescript中将函数参数定义为对象,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我宁愿将参数作为对象传递,这样顺序就不重要了,而不是单独调用参数传递的函数 e、 g 现在,我正在将我所掌握的一些代码迁移到Typescript,我不确定应该如何为这样一个函数定义接口 我尝试过类似的方法,但不起作用: 有什么线索吗?没有试过打字脚本。在JavaScript中也会考虑包含对象属性的缺省值以避免错误 Uncaught TypeError: Cannot destructure property `arg1` of 'undefined' or 'null'. 为了 const

我宁愿将参数作为对象传递,这样顺序就不重要了,而不是单独调用参数传递的函数

e、 g

现在,我正在将我所掌握的一些代码迁移到Typescript,我不确定应该如何为这样一个函数定义接口

我尝试过类似的方法,但不起作用:


有什么线索吗?

没有试过打字脚本。在JavaScript中也会考虑包含对象属性的缺省值以避免错误

Uncaught TypeError: Cannot destructure property `arg1` of 'undefined' or 'null'.
为了

const sum=({arg1,arg2,arg3})=>
arg1+arg2+arg3;
试一试{
console.log(sum())
}捕获(e){
控制台错误(e)
}
那么:

interface InputObj {
    arg1: number;
    arg2: number;
    arg3: number;
}

interface ExampleProps {
    sum: (input: InputObj) => number
}
或内联:

interface ExampleProps {
  sum: (
    input: {
      arg1: number;
      arg2: number;
      arg3: number;
    }
  ) => number;
}
但是根据您的用例,您可能不需要定义
ExampleProps
。这是您的
sum
函数,没有任意的
输入
对象名称:

const sum = ({
  arg1,
  arg2,
  arg3
}: {
  arg1: number;
  arg2: number;
  arg3: number;
}) => arg1 + arg2 + arg3;

以下是作为函数表达式的完整注释示例:

常数和:({
arg1,
arg2,
arg3
}: {
arg1:数字;
arg2:数字;
arg3:数字;
})=>number=({arg1,arg2,arg3})=>arg1+arg2+arg3;
这里是箭头函数的另一个更好的选择。只有参数被注释,编译器才能正确推断返回类型。该函数的混乱程度较低,工作原理与以前一样

const sum=({
arg1,
arg2,
arg3
}: {
arg1:数字;
arg2:数字;
arg3:数字;
})=>arg1+arg2+arg3;
如果要在单独的文件中注释函数:

接口参数{
arg1:数字;
arg2:数字;
arg3:数字;
}
类型Sum=(输入:Args)=>number;
const sum:sum=({arg1,arg2,arg3})=>arg1+arg2+arg3;
如果参数类型未知,则可以使用
any
作为参数类型。返回类型将被推断为任何:

const sum=({
arg1,
arg2,
arg3
}:any)=>arg1+arg2+arg3;
因此,这一个与前面的示例相同:

const sum:({arg1,arg2,arg3}:any)=>any
这对于arrow函数可能没有多大意义,但您可以为已知参数设置类型,并使用键值对来注释附加参数:

const sum=({
arg1,
arg2,
arg3
}: {
arg1:数字;
arg2:数字;
arg3:数字;
[键:字符串]:数字;
})=>arg1+arg2+arg3;
您还可以使用泛型:

接口参数{
arg1:数字;
arg2:数字;
arg3:数字;
}
常数和=({
arg1,
arg2,
arg3
}:T)=>arg1+arg2+arg3;
下面是相同的示例,sum as function语句

函数和({
arg1,
arg2,
arg3
}: {
arg1:数字;
arg2:数字;
arg3:数字;
}):号码{
返回arg1+arg2+arg3;
}

如果您的功能主体中有复杂的实现细节,则功能说明可能是更好的人机工程学选择。加上泛型在函数语句上看起来不那么笨拙。

如果需要显式注释函数类型,可以使用:

typefoo=(对象:{arg1:number,arg2:number;arg3:number})=>number;
常量条:Foo=({arg1,arg2,arg3})=>arg1+arg2+arg3

若要使用类型注释并共享结果,我建议您多谢您的建议,但它并没有回答我的具体问题。谢谢@XDgg。是的,我认为这会起作用,但考虑到几乎每次我定义一个函数时,我都会将参数包装为一个对象,因此为每个函数定义一个单独的接口会很麻烦。当然,有一种方法可以在一个接口文件中定义内联函数吗?在typescript中,函数不是用接口注释的。不能将ExampleProps应用于总和。糟糕的设计。
interface ExampleProps {
  sum: (
    input: {
      arg1: number;
      arg2: number;
      arg3: number;
    }
  ) => number;
}
const sum = ({
  arg1,
  arg2,
  arg3
}: {
  arg1: number;
  arg2: number;
  arg3: number;
}) => arg1 + arg2 + arg3;