gpt4 book ai didi

泛型扩展上的 TypeScript 奇怪的类型行为

转载 作者:行者123 更新时间:2023-12-04 08:40:13 24 4
gpt4 key购买 nike

interface empty{

}
type IfExtends<T, B, Y, N> = T extends B ? Y : N
let a: IfExtends<keyof empty, never, number, string> /// type never
let b: keyof empty extends never?number:string /// type number
在我看来通用类型 IfExtends等于b的类型 extends陈述。
但是 a 的类型从不,b 是数字(扩展为真)。
为什么?

最佳答案

这是应用 distributive conditional 的结果输入到 never .如果将分配条件类型应用于联合,则结果将是将该条件类型应用于联合的每个组成部分的联合:

type IfExtends<T> =  T extends number ? "Y" : "N"
type A = IfExtends<number | string> // = IfExtends<number> | IfExtends<string> = "Y" | "N"
那么这与 never有什么关系? ?如果我们尝试联合 never 可以得到提示与任何其他类型:
type X = never | number // just number, never is omitted
never是空联合,即没有成分的联合。因此,将它添加到任何其他联合会使其消失。
因为它是空联合,当分配它时,条件类型实际上永远不会被评估,因为联合中没有成分可以应用它,我们只是得到 never不管条件类型中的任何条件
使用实际的内联版本不会产生相同的结果,因为分配性只发生在裸类型参数上, T是裸类型参数, keyof empty不是。
您可以通过封装 T 来禁用分配性在元组类型中:
type IfExtends<T, B, Y, N> = [T] extends [B] ? Y : N
let a: IfExtends<keyof empty, never, number, string> /// also numberkeyof empty
Playground Link

关于泛型扩展上的 TypeScript 奇怪的类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64603346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com