Я не понимаю конструкцию языка

В данный момент я прохожу туториал по next js. В одном из файлов мне встретилось следующее:

import { sql } from '@vercel/postgres';

/* какой-то код */

export async function fetchRevenue() {
  try {
    /* какой-то код */
    const data = await sql<Revenue>`SELECT * FROM revenue`;
    /* какой-то код */
  } catch (error) {
    /* какой-то код */
  }
}

Определение sql примерно следующее:

declare const sql: VercelPool & (<O extends QueryResultRow>(strings: TemplateStringsArray, ...values: Primitive[]) => Promise<QueryResult<O>>);

Кто-нибудь объясните пожалуйста вот это действие: await sql<Revenue>`SELECT * FROM revenue`;

почему после sql стоит строка в обратных кавычках


Ответы (1 шт):

Автор решения: Qwertiy

Это обычная асинхронная теггирующая функция. Как f2 или f3, только ещё от тайпскрипта generic-параметр добавился между ней и строкой.

~async function() {
  function f1(strs, ...vals) {
    return strs[0]
  }

  console.log(f1 `abc`)

  function f2(strs, ...vals) {
    return new Promise(resolve => setTimeout(resolve, 1000, strs[0]))
  }

  console.log(await f2 `def`)
  
  async function f3(strs, ...vals) {
    await new Promise(resolve => setTimeout(resolve, 1000))
    return strs[0]
  }
  
  console.log(await f3 `hij`)  
}()

PS: Как собрать строку в интерполяторе?

→ Ссылка