首页 > 解决方案 > 使用扩展时推断泛型

问题描述

今天,我遇到了这种类型:

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 解析为什么。我假设编译器只是假设传递了没有显式类型的类型TBase

标签: typescript

解决方案


在您发布的代码段中,编译器不需要进行真正的推断。

在这一行——

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>

这些约束的实际推断和类型检查只有在您实际调用该函数时才会发挥作用。


推荐阅读