代码之家  ›  专栏  ›  技术社区  ›  Reza

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

  •  0
  • Reza  · 技术社区  · 4 年前

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

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

    参数 m n 将由另一个对象提供,例如

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

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

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

    所以我的问题是如何申请 default 在身体 foo 或者以某种方式拦截 foo 致电并申请前 违约

    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 });
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   xdeepakv    4 年前

    对于合并,您需要使用merge de-structure . default 这项任务在这里行不通。默认分配仅适用于传递值时对象未定义的情况。因此,您需要将默认值与传递的值合并。

    请检查代码中的注释。

    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();
    

    foo foo2 函数将工作。但是,如果参数多于几个,foo2会非常冗长。使用 Object.assign() {...} 合并价值。

        2
  •  0
  •   Józef Podlecki Brian    4 年前

    如何组合和解构函数内部的对象?

    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
      }
    
    }
    
        3
  •  0
  •   Vishal Sharma    4 年前

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

    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 });