TypeScript 通用条件类型缩小并不像预期的那样级联,

bq8i3lrv  于 6个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(74)

Bug报告

我已经尽力搜索相关问题并仔细阅读文档,但仍未找到任何有用的信息。如果这个bug最终被证明是重复的,甚至是根本不是一个bug,我感到很抱歉。

🔎 搜索词

条件类型未定义

🕗 版本与回归信息

在Playground中的所有版本( http://www.typescriptlang.org/play )

  • 这是我在每个版本中尝试的行为,我也查看了关于泛型和类型保护的常见问题解答。

⏯ Playground链接

Playground链接

💻 代码

type Foo<T extends number | string> = {
  value: T;
}

type Narrow<T extends number | string | undefined> = T extends undefined ? never : Foo<T>;
//                                                                                     ^
// ERROR: Type 'string | number | undefined' is not assignable to type 'string | number'.

🙁 实际行为

在上面的示例中,当将 T 传递给 Foo 时,Foo 会抛出错误,因为编译器认为 T 可能未定义。

🙂 预期行为

条件已经检查了 T 是否扩展了未定义,所以我希望在三元运算符的右侧,T 的类型会从 string | number | undefined 缩小到 string | number

rta7y2nd

rta7y2nd1#

我觉得理论上可能有一些原因解释为什么我们不这样做,但我现在无法重构它。

332nm8kg

332nm8kg2#

这是相关的,但我不确定它是否过时:#29188 (评论)
顺便说一下,这个方法是有效的

type Narrow<T extends number | string | undefined> = T extends number | string  ? Foo<T> : never;

相关问题