javascript - TypeScript 在调用对象(这是一个函数)的值时无法推断出正确的类型
问题描述
const record = {
foo: () => ({ foo: 1 }),
bar: () => ({ bar: 1 }),
}
function getRecord<T extends keyof typeof record>(type: T) {
return record[type];
}
const obj = getRecord(`foo`);
// if line 7 is: return record[type];
// typeof obj will be: () => { foo: number; }
// but if line 7 is: return record[type]();
// typeof obj will be: { foo: number; } | { bar: number; }
obj
当没有调用返回值时,TypeScript 可以成功推断出返回类型为() => { foo: number }
,但是当调用返回值时,类型推断扩大到{ foo: number; } | { bar: number; }
。为什么会这样?
解决方案
返回类型:
function getRecord<T extends keyof typeof record>(type: T) {
return record[type];
}
是(typeof record)[T]
。如您所见,泛型类型参数会在调用函数时影响函数的返回类型。
在第二个例子中:
function getRecord<T extends keyof typeof record>(type: T) {
return record[type]();
}
返回类型是{ foo: number } | { bar: number }
. 这里泛型参数不影响它(已经用于预评估返回类型)。
推荐阅读
- java - Flowable 将 bytearray 列加载为 BLOB
- async-await - 如何在 hylang 中编写像点(。)运算符这样的宏?
- sql - 有没有办法在 Oracle SQL 中将数字转换为带圆圈的数字?(1到①或20到⑳)
- concurrency - 使用并发调用从远程服务器检索数据的最佳方式是什么?
- javascript - 使用谷歌 cse 服务时出现错误:403 - ReactJS
- javascript - C#:错误的 DateTime 格式传递给前端
- attributes - 如何在类的所有属性上添加 Xss 属性?
- php - 如何使用基于数组的内爆来分隔多个值或拆分多个值?
- instagram - IG 图形 API:轮播上的视频观看次数
- spotbugs - 排除 LocalDate 类以供 SpotBugs 插件检查