Как назначить асинхронную константу свойству объекта в typescript / javascript

#javascript #angular #typescript

Вопрос:

В следующем примере я пытаюсь назначить асинхронные функции const как обещания свойству родительского объекта, чтобы к нему можно было лениво обращаться в дальнейшем коде, таком как функция fn: async GetItem() в примере.

Но при присвоении констант свойствам «Подразделы» я получаю ошибку:

В типе «ItemI» отсутствуют следующие свойства типа «Обещание»: затем, наконец, поймайте [Symbol.toStringTag]ts(2739)

Не могли бы вы объяснить, пожалуйста, чего мне не хватает и как это исправить? Спасибо.

                 // interface for each item object
interface ItemI {
  id: number,
  name: string,
  subItems?: Promise<ItemI>[]
}
                // item object 1
const item_A01: ItemI = {
  id: 1,
  name: 'item_A01'
}
                // item object 2
const item_A02: ItemI = {
  id: 2,
  name: 'item_A02'
}

                // async constant - Promise of each item object
async const async_item_A01 = (): ItemI => { return item_A01 };
async const async_item_A02 = (): ItemI => { return item_A02 };

                // parent item with the Promissed item objects
async const parentItem: ItemI = {
  id: 0,
  name: 'parentItem',
                // ERROR:
                // Type 'ItemI' is missing the following properties 
                // from type 'Promise<ItemI>': 
                //     then, catch, finally, [Symbol.toStringTag] ...
  subItems:  [async_item_A01(), 
              async_item_A02()
            ]
}
                // function to work with an actual item
                // from the Promissed / async constants
                // by the provided index
async function getItem (itemIndex: number) {
  const resolved_item: ItemI = await parentItem.subItems[itemIndex];
  console.log('my resolved item is:', resolved_item.name);
}
 

Ответ №1:

Это функция, которая async не должна быть const . Кроме того, тип возвращаемого значения должен быть Promise<ItemI> :

 const async_item_A01 = async (): Promise<ItemI> => { return item_A01 };
const async_item_A02 = async (): Promise<ItemI> => { return item_A02 };
 

Кроме того, удалите async здесь:

 const parentItem: ItemI = {
  id: 0,
  name: 'parentItem',
  subItems: [
    async_item_A01(),
    async_item_A02()
  ]
}
 

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

1. Ну, конечно, оценил …

2. Вообще никаких проблем 🙂