Вы можете просто положиться на вмешательство аргумента типа в универсальных типах 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 .