typescript - 使用扩展时推断泛型
问题描述
今天,我遇到了这种类型:
interface Base {
one: number;
two: number;
}
export type SelectSubset<T, U> = {
[key in keyof T]: key extends keyof U ? T[key] : never
}
type TQuestion = <T extends Base>(args: SelectSubset<T, Base>) => void
const example: TQuestion = (obj) => {}
我非常不确定为什么T
在这个例子中可以推断出泛型的类型。我看到它T
受限于 Base 但会假设我必须为编译器传递一个默认值才能确定 T 解析为什么。我假设编译器只是假设传递了没有显式类型的类型T
?Base
解决方案
在您发布的代码段中,编译器不需要进行真正的推断。
在这一行——
const example: TQuestion = (obj) => {};
你只是定义了一个 type 的函数,TQuestion
这里不需要做推断。由于obj
参数上没有明确提及类型,因此它是从TQuestion
类型中提取的。这相当于-
function example<T extends Base>(obj: SelectSubset<T, Base>): void {}
如果你这样做了——
const example = (obj) => {};
编译器会抱怨obj
缺少类型并且具有隐式any
类型(假设您将“无隐式任何”设置设置为 true)。在这里,一个类型是完全缺失的,但是当你声明example
为 typeTQuestion
时,你存储在其中的函数应该是type TQuestion
,这就是obj
参数自动获取类型的原因SelectSubset<T, Base>
这些约束的实际推断和类型检查只有在您实际调用该函数时才会发挥作用。
推荐阅读
- ansible - 使用ansible模块的两个文件的区别
- android - 是否有一个应用程序级的进入和退出点可以用来跟踪我的 Android 应用程序运行的累积时间?
- ssas - 更改事实表粒度的最佳方法?
- python - MinMaxScaler 无法正确缩放
- unity3d - 用于 P2P 服务器的 UNET 的统一替代方案
- c# - FACEBOOK API GRAPH 检查设备登录状态时出错
- php - 循环检查复选框并删除所有勾选的类别的正确方法是尽可能少的查询?
- android - 适用于 Android 的 OpenJML/Jessie
- rebus - 通用错误处理程序生成错误消息重复
- javascript - 如何使用 tus-client 恢复和上传文件上传