Как передать значение по умолчанию для именованных параметров в javascript - PullRequest
1 голос
/ 28 мая 2020

У меня есть метод в машинописном тексте, как показано ниже, с использованием именованных параметров

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 перед вызовом и применением 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 });

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Для слияния вам нужно использовать слияние, используя 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() или {...} для объединения значений.

0 голосов
/ 28 мая 2020

Вы можете просто добавить значение по умолчанию в самом параметре, как показано ниже:

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

0 голосов
/ 28 мая 2020

Как насчет объединения и разрушения объекта внутри функции?

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
  }

}
...