从联合中提取非索引类型
Extract non-index types from a union
我可以充分利用像 Extract<T>
这样的类型,它可以解析联合 T
中不是 string
或 number
的所有类型。这可能吗?
Extract<T, string | number>
会找到 扩展 string
或 number
的所有内容,但我想要一些可以提取所有内容的东西,这不是 完全 string
或 number
.
我想要的一些示例,如果类型被命名为 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'
的所有知识都丢失了,因此无法提取。
注意:
类型 T
和 U
如果 T extends U
和 U extends T
.
可以被认为是相等的
我想我已经按照以下方式将它钉牢了:
type StrictInvExtract<T, U> = T extends U ? (U extends T ? never : T) : T;
type NonIndex<T> = StrictInvExtract<T, string>;
但是最后一个案例的失败让我意识到所有的方法都是死胡同。
我可以充分利用像 Extract<T>
这样的类型,它可以解析联合 T
中不是 string
或 number
的所有类型。这可能吗?
Extract<T, string | number>
会找到 扩展 string
或 number
的所有内容,但我想要一些可以提取所有内容的东西,这不是 完全 string
或 number
.
我想要的一些示例,如果类型被命名为 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'
的所有知识都丢失了,因此无法提取。
注意:
类型 T
和 U
如果 T extends U
和 U extends T
.
我想我已经按照以下方式将它钉牢了:
type StrictInvExtract<T, U> = T extends U ? (U extends T ? never : T) : T;
type NonIndex<T> = StrictInvExtract<T, string>;
但是最后一个案例的失败让我意识到所有的方法都是死胡同。