typescript - 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
会出错。
那么,我应该怎么做才能推断出正确的呢?
解决方案
您可以简单地依赖 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 }>
.
推荐阅读
- metpy - metpy 抱怨文件是无效数据
- c++ - 在 OSX10.15 上将自己的 dylib 与 libtool 链接时未定义的符号“__Unwind_Resume”
- php - 如何制作侧类系统
- javascript - 如何将自定义指令添加到 Angular Material Dialog 组件
- sql - 如何对特定的 SQL 列进行分组并检索这些列的计数最高的行?
- sql - Postgres JSON转换函数的正确使用
- javascript - sap.m.table有json绑定表有输入字段,如何捕获输入条目
- javascript - 未从 d3-array 导出的组
- javascript - 如何在 HTML 页面上使用 Hooks 渲染对 ID 的反应?
- plot - gnuplot 5 向后兼容性声明不正确,所以现在如何仅绘制文件中的一些标签