【发布时间】:2019-04-21 13:16:28
【问题描述】:
我正在尝试利用反应类型来实现(用于学习目的)视图框架。
除了尝试将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>
使用 bang ! 运算符(我知道它永远不会是 never),但它不能用于类型定义 (?)。
有什么线索吗?
提前致谢 赛博
【问题讨论】:
标签: typescript typescript-typings typing