【问题标题】:Extract non-index types from a union从联合中提取非索引类型
【发布时间】:2020-11-24 00:56:03
【问题描述】:

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

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

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

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

Here 是我在操场上最近的一次,但你可以看到它还不正确。能做到吗?


我的激励用例是(基本上)改进omit() 在我的一个开源库中的输入。如果你很勇敢,可以看看我的几乎解决方案here。但请注意,它有很多打字!正如该链接所评论的那样,除了最后一行之外,一切都运行良好。

【问题讨论】:

  • 你为什么要这个?是this questionthis question中提到的用例吗?如果不是,那你能详细说明一下吗?也许有其他解决方案可以解决您的根本问题。
  • 当然。我更新了我的问题以包括我的实际用例。但它需要接受很多东西!
  • 看起来你想要第二个链接问题中的KnownKeys,但你的omit 的细节比我想涉足的要多一点。请注意如何使用KnownKeys 来构建Omit 的不同版本,它在面对可索引类型时表现得更好一些,例如this。您的用例是否希望 Omitʹ&lt;T, string&gt;T 中删除所有 known 字符串文字键以及任何字符串索引取决于您,但您可以使用 KnownKeys 这样做。如果这构成了你的答案,我会写下来。
  • 感谢指点和操场!我希望Omit'&lt;T, string&gt; 不考虑索引键(从Record&lt;string, any&gt; 中省略单个未知字符串仍然是Record&lt;string, any&gt;)并将已知参数变为可选参数(因为我们不知道可能省略了哪个参数,如果有的话)。省略已知字符串也应该单独保留索引键,但删除匹配的已知键。我会用你今晚给我的东西来看看我能不能把它融合在一起!
  • 我尝试了一段时间让事情正常进行,并在此过程中学到了东西。谢谢你的帮忙!最后,我决定妥协,不支持最稀有的用例,因为我无法弄清楚它们。

标签: typescript typescript-typings


【解决方案1】:

我相信你总是会被这个事实所困扰

type x = string |  'a' 

x 简单地解析为string,因为'a' 只是string 的一个特化

同样适用

type y = number | 1

(即y 只是number

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

NonIndex<string | 'a'>

被类型系统解释为简单:

NonIndex<string>

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

注意:

如果T extends UU extends T,则可以认为TU 类型相等。

我以为我会用类似以下的方式来解决这个问题:

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

但最后一个案例的失败让我意识到所有解决此问题的方法都是死路一条。

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 1970-01-01
    • 2019-10-24
    • 2019-03-05
    • 2020-09-22
    • 1970-01-01
    • 2022-07-19
    • 2022-09-29
    • 2023-02-03
    相关资源
    最近更新 更多