【发布时间】:2021-06-02 19:09:04
【问题描述】:
我做了一些演示来重现我的问题。他们来了。
问题1:为什么输入g会得到2?
// 1
type f = [never] extends [infer S1, ...infer S2]
? ([S1] extends [never] ? 1 : 2)
: 3
// why 2
type g = [never] extends [infer S1, ...infer S2]
? ([never] extends [S1] ? 1 : 2)
: 3
在我看来,输入f 等于g,因为S1 是never。
问题2:为什么输入h 会得到2?
// 1
type i = [never] extends [infer S1]
? ([never] extends [S1] ? 1 : 2)
: 3
// why 2
type h = [never] extends [infer S1, ...infer S2]
? ([never] extends [S1] ? 1 : 2)
: 3
在我看来,输入i 等于h,因为S2 未被使用。
问题3:为什么输入k会得到never?
// 1
type j = [never] extends [infer S1, ...infer S2]
? (never extends S1 ? 1 : 2)
: 3
// why never ?
type k = [never] extends [infer S1, ...infer S2]
? (S1 extends never ? 1 : 2)
: 3
我什至无法理解。我认为k 至少应该是1 2 3 之一。
【问题讨论】:
-
问题 1 和 2 对我来说似乎是 TypeScript 的错误,但在我有机会研究它之前我不确定。类型 3 是因为
S1 extends never ? 1 : 2是 distributive conditional type 并且never被视为“空联合”:如果F<T | U>始终等于F<T> | F<U>,那么您可以证明F<never>应该是never(或至少F<T>的每个可能输出的子类型)。 See this answer. -
我仍然没有为#1 和#2 找到任何具体的东西。如果我没有找到任何东西,您可能想提交一个带有 this 之类的错误作为您的问题的 minimal reproducible example。看起来在 TS4.1 和 TS4.2 之间发生了什么。看起来它是 #42331 的变体,可能没有修复。
标签: typescript