为什么此 CustomExtract 返回与默认 Extract 不同的结果?

Hen*_*uno 6 typescript typescript-generics

代码解释了我的问题:

type A = {
  a: number,
} | null

// Extract as defined in lib.es5.d.ts
type Extract<T, U> = T extends U ? T : never;

type CustomExtract = A extends null ? A : never;

type Result1 = Extract<A, null> // null
type Result2 = CustomExtract;   // never
Run Code Online (Sandbox Code Playgroud)

Extract 和 CustomExtract 是相同的代码,不同之处在于 Extract 是泛型类型。

另外,作为相关示例,string | null不扩展null.

那么,在这个主题中,类型到底是如何工作的呢?我可以想象它可能会为每种类型的联合运行通用类型,然后将所有结果联合起来,但我想要真正的技术定义和工作原理。

jca*_*alz 5

区别在于 thatExtract分配条件类型,而 yourCustomExtract不是。

为了使形式的条件类型X extends Y ? A : B具有分布式功能,检查的类型X必须是“裸类型参数”;也就是说,像in和那样的类型参数是裸露的,因为它只是被检查的类型参数(即),而不仅仅是包含类型参数的某些表达式(例如或)。Tinterface Foo<T> {...}T extends ...Promise<T> extends ...[T] extends ...

正如您所猜测的,分布式条件类型确实评估为检查类型的每个联合元素的条件的并集T。因此 ifF<T>是分配条件类型,那么F<A | B | C>将被评估为F<A> | F<B> | F<C>。一个潜在的问题是,无论细节是什么(只要它是分布式的),F<never>都会被评估,因为被认为是“空联合类型”neverFnever

有关更多信息,请参阅我的其他答案,了解什么是分布式条件类型以及它们如何工作。