【问题标题】:Can't Omit props on conditional type that need to returns never because of infer - how to?不能省略由于推断而需要返回的条件类型的道具 - 如何?
【发布时间】:2019-04-21 13:16:28
【问题描述】:

我正在尝试利用反应类型来实现(用于学习目的)视图框架。 除了尝试将conditional typeOmit 类型混合(展示它需要@types/react 包)之外,一切都很好而且花花公子:

import {DetailedHTMLFactory, ReactHTML} from 'react'

type Tags = keyof ReactHTML

type ReactPropsFrom<Tag extends Tags> =
  ReactHTML[Tag] extends DetailedHTMLFactory<infer P, any> ? P : never

此时,根据反应定义,我确实拥有HTMLElement 的属性,方法是使用(用于锚点)ReactPropsFrom&lt;'a'&gt;。 剩下要做的是删除反应特定的属性。让我们定义其中的一些:

type ReactSpecificProps =         |
  'defaultChecked'                |
  'defaultValue'                  |
  'suppressHydrationWarning'      |
  'suppressContentEditableWarning'

还有Omit 类型

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

如果我这样做 Omit&lt;ReactPropsFrom&lt;'a'&gt;, ReactSpecificProps&gt; 一切都很好,并且我确实在结果类型中拥有我想要的所有属性。

但如果我像这样采用更通用的方法:

type Props<Tag extends Tags> = Omit<ReactPropsFrom<Tag>, ReactSpecificProps>

我最终遇到了这个错误

// type ReactSpecificProps = "defaultChecked" |...
// Type '"defaultChecked"' is not assignable to type 'keyof ReactPropsFrom<Tag>'.
// Type '"defaultChecked"' is not assignable to type 'never'

我确实理解它,因为ReactPropsFrom 可能会返回never(即使它永远不会因为泛型传递总是扩展Tags),并且在这种情况下类型检查器会中断。但据我所知,为什么我无法想办法避免这个问题。

我天真地跳了类似的东西:

type Props<Tag extends Tags> = Omit<ReactPropsFrom<Tag>!, ReactSpecificProps>

使用 bang ! 运算符(我知道它永远不会是 never),但它不能用于类型定义 (?)。 有什么线索吗?

提前致谢 赛博

【问题讨论】:

    标签: typescript typescript-typings typing


    【解决方案1】:

    要让编译器相信ReactPropsFrom&lt;Tag&gt; 确实包含ReactSpecificProps,您可能会遇到很多麻烦,但我建议不要这样做。 3.5 中的Omit 类型不会将K 限制为keyof TPRdeclination to add the constraint)。所以解决办法就是去掉K的约束就可以了。

    为了完整起见,这就是说服编译器所需要的(至少我想出的,可能有更短的方法):

    type Props<Tag extends Tags> = ReactPropsFrom<Tag> extends infer U ?
        [U] extends [Partial<Record<ReactSpecificProps, any>>] ? Omit<U, ReactSpecificProps> : never: never;
    

    【讨论】:

    • 非常感谢 ;) 就像一个快速说明没有得到你所做的最后一行代码的用途一样?你能解释一下它的目的吗?提前发送
    • @zedryas 这是我试图让事情与约束一起工作。基本上我把ReactPropsFrom&lt;Tag&gt; 放在类型变量U 中。然后我检查它扩展了Partial&lt;Record&lt;ReactSpecificProps, any&gt;&gt;。这将使编译器认为在真正的分支上U 具有ReactSpecificProps 中的属性,因此keyof U 将包括ReactSpecificProps
    猜你喜欢
    • 2022-08-02
    • 2016-05-02
    • 2021-08-28
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多