首页 > 解决方案 > Typescript 不会从平面属性函数中推断出解析的属性

问题描述

我有一个函数负责扁平化对象属性。

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()推断的返回类型缺少名称和年龄属性,所以当我尝试这样做时parsedResult.name会出错。

Link for playground: https://www.typescriptlang.org/play/?ssl=24&ssc=2&pln=1&pc=1#code/IYZwngdgxgBAZgV ​​2gFwJYHsIwI4IKYBOYAPACowC8MA3gL4B8AFLoWAFwwjIGoQDmASg4AFAugC2qEHjL0aAKBgwCeZAgJZREqXgB0KkOgA2ANzyNqipTBPAj+DgHICwCABMJNu-hgALQniOADRWSi7uEgCCyNyoAEYIyHhO4R7iAGregVa0AjCg+RBg8rTy8shgAA54MACK+EQASnggCEbIspQKSqhuHFw8-FZuwMjAHKQlZaCQsIgoGFgESADKEnj1rIx5lkpQmFzKLW3IXcAA7sCopyxExJtNx+3E1DAQwOLJnLH8Qfl8XwGvD4MAYTEcKwAogAZSEAYXIKwA8gBZSGkAASAEkAHIAcRgADFGqiYJEcUjMZDGjBMbi8Y4BFZ9hBDpVgARpG5mq12l04EZRjyTowDCcmWFVOosOzOXhuU9kLp3p8pvJ5lA0Jh4ILkMLnuQ8AAPJLuEB1BpgfUdOj0Ji3K2KiY7KwqNQabrWXocB3W3S9ELWGC6EO+xW6EZjHIlIA

那么,我应该怎么做才能推断出正确的呢?

标签: typescript

解决方案


您可以简单地依赖 TypeScript 泛型中的类型参数干扰:即让传入的参数flatResult()确定返回类型:

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

之所以可行,是因为编译器会查看参数的类型queryResultflatResult当您在此行中调用/调用时:

// 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 上的概念验证示例


推荐阅读