作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
陈述。
最佳答案
这是应用 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/
我是一名优秀的程序员,十分优秀!