繁体   English   中英

如何在 javascript 中为命名参数传递默认值

[英]How to pass default for named parameters in javascript

我在 typescript 中有一个使用命名参数的方法,如下所示

public foo({x, y, z , m , n} : {x:string, y: number, z: number, m?:string, n?:number}) {
}

参数mn将从另一个 object 提供,例如

const default = { m : 'M', n :10, o:6 }

现在我想像下面这样调用 foo 并且我希望添加默认参数而不在调用中显式传递它们

  foo({x:'x', y: 5, z: 0})

所以我的问题是如何在foo的主体中应用default ,或者在调用之前以某种方式拦截foo并应用default

public foo({x, y, z , m , n} = {x:string, y: number, z: number, m?:string, n?:number}) {
   // for example how to apply default here

}

请注意,为简单起见,我减少了参数数量

我也知道以下这些解决方案我正在寻找样板代码更少的东西

public foo({x, y, z , m , n} = {x:string, y: number, z: number, m?:string, n?:number}) {
   if (!m) {
     m = default.m;
   }
   if (!n) {
     n = default.n;
   }

}

或者

foo({...default, x:'x', y: 5, z: 0 });

对于合并,您需要使用de-structure进行合并。 default分配在这里不起作用。 仅当 object 在传递值时未定义时,默认分配才有效。 因此,您需要将默认值与传递的值合并。

请检查代码中的注释。

interface Foo {
  x: string;
  y: number;
  z: number;
  m?: string;
  n?: number;
  o?: number;
}
const defaultValue = { m: "M", n: 10, o: 6 } as Foo;
class A {
  public foo(props: Foo) {
    const { x, y, z, m, n } = { ...defaultValue, ...props };
    console.log(x, y, z, m, n);
  }
  public foo2({ x, y, z, m = defaultValue.m, n = defaultValue.n }: Foo) {
    // this will work, but verbose
    console.log(x, y, z, m, n);
  }
  public foo1({ x, y, z, m, n }: Foo = defaultValue) {
    // this will work only if foo1 called without argument
    console.log(x, y, z, m, n);
  }
  public print() {
    this.foo({ x: "x", y: 5, z: 0 }); // x 5 0 M 10
    this.foo1(); // undefined undefined undefined 'M' 10
    this.foo1({ x: "x", y: 5, z: 0 }); // x 5 0 undefined undefined
    this.foo2({ x: "x", y: 5, z: 0 }); // x 5 0 M 10
  }
}
const a = new A();
a.print();

foofoo2 function 将工作。 但是,如果 arguments 的数量过多,则 foo2 会非常冗长。 使用Object.assign(){...}合并值。

在 function 中组合和破坏 object 怎么样?

type someType = {x:string, y: number, z: number, m?:string, n?:number};
const initialValues = { m : 'M', n :10, o:6 }

function foo(obj: someType) {
  const {x, y, z , m , n} = {
    ...initialValues,
    ...obj
  }

}

您可以在参数本身中添加一个默认值,如下所示:

public foo({x, y, z , m = 'a' , n = 10} = {x:string, y: number, z: number, m?:string, n?:number}) {
}

如果您传递一个值,默认值将被覆盖。 通过这种方式,您甚至不需要if来检查值的存在。

您仍然可以将该方法称为:

foo({...default, x:'x', y: 5, z: 0 });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM