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”,但在这种情况下(从表面上看)Nnot 可分配给 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 章节中进行了描述。