Деструктурирование асинхронных свойств в JavaScript/TypeScript

#javascript #typescript #async-await #destructuring

Вопрос:

Есть ли способ получить async свойства с помощью деструктурирования в JavaScript/TypeScript?

Подобный этому:

 class A {  public get x() {  return this.getX()  }   private async getX() {  return 5  } }  async function f(a : A) {  const { x } = a   console.log(x) // Promise } async function g(a : A) {  // works as const x = await a.x  const { await x } = a   console.log(x) // 5 }  

Комментарии:

1. const { x } = await a

2. @DimaParzhitsky, я думаю, что он вернется Promise , так как его ждут a , а не ждут a.x .

3. Ладно, понял. Не судите меня, люди часто путают await a.x и (await a).x

4. Боюсь, в JavaScript еще нет такого синтаксиса, вам придется сделать const x = await a.x

5. Нет, это не так. Также странно иметь добытчиков, которые возвращают обещания (которые обычно связаны с побочными эффектами), каков ваш фактический вариант использования?

Ответ №1:

Если разрешено использовать функцию полезности, будет работать следующее.
ее побочный эффект заключается в том, что выполняются получатели для всех свойств.

 const classToObject = async theClass =gt; {  const originalClass = theClass || {}  const keys = Object.getOwnPropertyNames(Object.getPrototypeOf(originalClass))  let classAsObj = {}  for(const key of keys) {  classAsObj[key] = await originalClass[key]   }  return classAsObj }   async function g(a : A) {  // works as const x = await a.x  const {x} = await classToObject(a);  console.log(x) // 5 }