我试图利用反应类型来实现(为了学习目的)视图框架。
除了尝试将conditional type
与Omit
类型混合使用(要展示它,需要包装@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
),但不能在类型定义(?)上使用。
有任何线索吗?
预先感谢 塞巴
答案 0 :(得分:1)
您可能会遇到很多麻烦,以使编译器确信oldFile
确实包含ReactPropsFrom<Tag>
,但我建议您不要这样做。 3.5版本中的ReactSpecificProps
类型并不约束Omit
为K
(PR和declination to add the constraint)。因此,解决方案是只消除对keyof T
的约束,一切都会奏效。
为完整起见,这是令人信服的编译器所采取的措施(至少是我想出的方法,可能会有更短的方法):
K