Typescript 扩展以排除工会成员
Typescript extends for excluding union members
考虑以下使用 extends
从联合类型中删除成员的方法:
type RemoveNames<N, K> = N extends K ? never : N
type Names = 'bill' | 'jane' | 'freddy'
type Bill = RemoveNames<Names, 'jane' | 'freddy'> // type Bill = 'bill'
在 中,N extends K
被定义为表示“N 可分配给 K”,但在这种情况下(从表面上看)N
是 not 可分配给 K
- 只有 N
的缩小版本可分配给 K
.
在这种情况下如何解释extends
?如果 N
的成员不在 K
中,是否对其进行了迭代和“过滤”(?)?
解析 Bill
类型时,TypeScript 获取 Names
联合类型的每个类型并解析条件类型 N extends K ? never : N
,然后构建最终的联合类型,结果为:
'bill'
是否扩展 'jane' | 'freddy'
?否:N extends K ? never : N
给出 'bill'
'jane'
是否扩展 'jane' | 'freddy'
?是:N extends K ? never : N
给出 never
'freddy'
是否扩展 'jane' | 'freddy'
?是:N extends K ? never : N
给出 never
最终类型是这三种类型 'bill' | never | never
的联合,它给出 'bill'
.
此行为在文档的 Distributive Conditional Types 章节中进行了描述。
考虑以下使用 extends
从联合类型中删除成员的方法:
type RemoveNames<N, K> = N extends K ? never : N
type Names = 'bill' | 'jane' | 'freddy'
type Bill = RemoveNames<Names, 'jane' | 'freddy'> // type Bill = 'bill'
在 N extends K
被定义为表示“N 可分配给 K”,但在这种情况下(从表面上看)N
是 not 可分配给 K
- 只有 N
的缩小版本可分配给 K
.
在这种情况下如何解释extends
?如果 N
的成员不在 K
中,是否对其进行了迭代和“过滤”(?)?
解析 Bill
类型时,TypeScript 获取 Names
联合类型的每个类型并解析条件类型 N extends K ? never : N
,然后构建最终的联合类型,结果为:
'bill'
是否扩展'jane' | 'freddy'
?否:N extends K ? never : N
给出'bill'
'jane'
是否扩展'jane' | 'freddy'
?是:N extends K ? never : N
给出never
'freddy'
是否扩展'jane' | 'freddy'
?是:N extends K ? never : N
给出never
最终类型是这三种类型 'bill' | never | never
的联合,它给出 'bill'
.
此行为在文档的 Distributive Conditional Types 章节中进行了描述。