从联合中提取非索引类型

Extract non-index types from a union

我可以充分利用像 Extract<T> 这样的类型,它可以解析联合 T 中不是 stringnumber 的所有类型。这可能吗?

Extract<T, string | number> 会找到 扩展 stringnumber 的所有内容,但我想要一些可以提取所有内容的东西,这不是 完全 stringnumber.

我想要的一些示例,如果类型被命名为 NonIndex:

NonIndex<string | 1>; // expect 1
NonIndex<'a' | 1>; // expect 'a' | 1
NonIndex<string | 'a'>; // expect 'a'

Here 是我在操场上最接近的,但你可以看到它还不对。可以吗?


我的激励用例是(实质上)改进 omit() in one of my open source libraries. If you're very brave, you can take a look at my almost solution here 的打字。但要注意,它有很多打字正在进行!正如 link.

评论的那样,除最后一行外,一切都运行良好

我相信你会一直被这样的事实所困扰

type x = string |  'a' 

x 简单地解析为 string 因为 'a' 只是 string

的特化

同样适用于

type y = number | 1

(即 y 只是 number

这使得你的最后一个案例无法解决,因为:

NonIndex<string | 'a'>

被类型系统简单地解释为:

NonIndex<string>

'a' 的所有知识都丢失了,因此无法提取。

注意:

类型 TU 如果 T extends UU extends T.

可以被认为是相等的

我想我已经按照以下方式将它钉牢了:

type StrictInvExtract<T, U> = T extends U ? (U extends T ? never : T) : T;
type NonIndex<T> = StrictInvExtract<T, string>;

但是最后一个案例的失败让我意识到所有的方法都是死胡同。