Typescript не выводит проанализированные атрибуты из функции плоских атрибутов - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть функция, которая отвечает за выравнивание атрибутов объекта.

async function query<T = {}>(query: string): Promise<T> {
  return Promise.resolve({
    value: 'random value here',
    randomAttribute: 'randomValue'
  }) as any
}

type QueryResult<T> = {
  id: string
  data: T
}

async function runSomeQuery() {
  const result = await query<QueryResult<{ name: string, age: string }>>('SELECT SOMETHING FROM ANOTHER THING')
  const parsedResult = flatResult(result)
  return parsedResult.name
}

function flatResult<T extends QueryResult<{}>>(queryResult: T) {
  return {
    id: queryResult.id,
    ...queryResult.data
  }
}

Но в выводимом типе flatResult() отсутствуют атрибуты name и age, поэтому при попытке сделать parsedResult.name я получаю ошибку.

1007 * Ссылка на детскую площадку: https://www.typescriptlang.org/play/?ssl=24&ssc=2&pln=1&pc=1#code / IYZwngdgxgBAZgV2gFwJYHsIwI4IKYBOYAPACowC8MA3gL4B8AFLoWAFwwjIGoQDmASg4AFAugC2qEHjL0aAKBgwCeZAgJZREqXgB0KkOgA2ANzyNqipTBPAj + DgHICwCABMJNu-hgALQniOADRWSi7uEgCCyNyoAEYIyHhO4R7iAGregVa0AjCg + RBg8rTy8shgAA54MACK + EQASnggCEbIspQKSqhuHFw8-FZuwMjAHKQlZaCQsIgoGFgESADKEnj1rIx5lkpQmFzKLW3IXcAA7sCopyxExJtNx + 3E1DAQwOLJnLH8Qfl8XwGvD4MAYTEcKwAogAZSEAYXIKwA8gBZSGkAASAEkAHIAcRgADFGqiYJEcUjMZDGjBMbi8Y4BFZ9hBDpVgARpG5mq12l04EZRjyTowDCcmWFVOosOzOXhuU9kLp3p8pvJ5lA0Jh4ILkMLnuQ8AAPJLuEB1BpgfUdOj0Ji3K2KiY7KwqNQabrWXocB3W3S9ELWGC6EO + xW6EZjHIlIA 1012 * Итак, что я должен сделать, чтобы это Вывод верно?

1 Ответ

2 голосов
/ 03 апреля 2020

Вы можете просто положиться на вмешательство аргумента типа в универсальных типах TypeScript: т.е. позволить аргументу, переданному в flatResult(), определить тип возвращаемого значения:

function flatResult<T>(queryResult: QueryResult<T>) {
  return {
    id: queryResult.id,
    ...queryResult.data
  }
}

Причина, по которой это работает, заключается в том, что компилятор будет смотреть на тип арумента queryResult. Когда вы вызываете / вызываете flatResult в этой строке:

// In the line below, `result` has the correct inferred type
const result = await query<QueryResult<{ name: string, age: string }>>('SELECT SOMETHING FROM ANOTHER THING')

// And this type will be passed into `flatResult()` and available to the generic type
const parsedResult = flatResult(result)

Вы на самом деле уже сообщаете flatResult, что тип result должен быть таким, какой он есть, который набирается как QueryResult<{ name: string, age: string }>.

См. Пример проверки концепции на TypeScript Playground .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...