不能忽略因推断而永远不会返回的条件类型道具-如何?

时间:2019-04-21 13:16:28

标签: typescript typescript-typings typing

我试图利用反应类型来实现(为了学习目的)视图框架。 除了尝试将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<'a'>(对于锚点)。 剩下要做的就是删除反应的特定属性。让我们定义其中一些:

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

Omit类型

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

如果我做Omit<ReactPropsFrom<'a'>, ReactSpecificProps>一切都很好,并且我的结果类型中确实有我想要的所有属性。

但是,如果我采用这样一种更通用的方法:

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>

使用爆炸!运算符(据我所知它将永远不会是never),但不能在类型定义(?)上使用。 有任何线索吗?

预先感谢 塞巴

1 个答案:

答案 0 :(得分:1)

您可能会遇到很多麻烦,以使编译器确信oldFile确实包含ReactPropsFrom<Tag>,但我建议您不要这样做。 3.5版本中的ReactSpecificProps类型并不约束OmitKPRdeclination to add the constraint)。因此,解决方案是只消除对keyof T的约束,一切都会奏效。

为完整起见,这是令人信服的编译器所采取的措施(至少是我想出的方法,可能会有更短的方法):

K