【发布时间】:2019-05-13 04:31:35
【问题描述】:
当类型联合通过 TypeScript 中的条件类型传递时,删除条件时返回的值不一致。
当给定类型的联合时,typescript 正确地将可能的参数合并到每个参数中。
type Fn<T> = (arg: T) => void
Fn<string | number> // (arg: string | number) => void
但是,当混合使用条件参数时,参数将被解析
type ConditionalFn<T> = T extends never ? Fn<T> : Fn<T>
ConditionalFn<string | number> // Fn<string> | Fn<number>
// That is equivalent to which is ((arg: string) => void | (arg: number) => void)
通常这不是问题。但是当函数的类型设置为条件类型时,参数都设置为any,并且需要手动转换。
我希望ConditionalFn<string | number> 解析为Fn<string> | Fn<number>,然后进一步解析为Fn<string | number>。
为什么Improved behavior for calling union types
示例中的f 变量需要参数类型的交集?
我认为这是我困惑的根本原因。因为如果没有任何交集,它会强制参数类型为any。
【问题讨论】:
-
“为什么
f变量需要参数类型的交集?”这个例子解释了它。这是参数类型逆变的结果。如果您认为函数的联合实际上是什么,您可以看到“或”(联合)如何切换到“和”(交集)。想象一对同卵双胞胎,Jen 和 Jan。我知道 Jen 喜欢吃各种蔬菜,我知道 Jan 喜欢吃任何有机食物。其中一个要来吃饭,但我不知道是哪一个。这将是 Jen 或 Jan。我可以安全地喂我的神秘客人什么? -
我不能喂她传统的(非有机的)茄子,因为 Jan 可能不喜欢非有机的东西。我不能喂她有机牛排,因为如果是珍,她可能不喜欢肉。唯一安全的赌注是有机茄子……既是有机又蔬菜的东西。函数的联合需要参数的交集。
-
完美,这个描述很有道理。在我认为这些论点的结合应该奏效之前。但我现在明白了逆变。谢谢:)
标签: typescript