typescript - TypeScript 类型,它排除了泛型参数为 `any` 的类型
问题描述
这是 React FunctionComponent 的 TypeScript 类型的一个分支,它只返回一个 IntrinsicElement。
React 定义
declare namespace JSX {
type Element = React.ReactElement<any, any>;
}
虽然我在 中找不到它@types/react/index.d.ts
,但渲染 a会<Fragment>
返回 a JSX.Element
。所以,如果我想为一个函数定义一个类型,该函数只返回一个 HTML 元素(即不是 a Fragment
,除非它只有一个子元素,这会破坏它的目的),我需要以某种方式将我的返回类型限制为类似
type IntrinsicFC =
() => Exclude<JSX.IntrinsicElements[keyof JSX.IntrinsicElements], ReactElement<any, any>>;
(注意:Exclude<..., ReactElement<any, any>>
并不意味着我所期望的;它似乎与JSX.IntrinsicElements[keyof JSX.IntrinsicElements]
虽然我不明白为什么相同。但是,为了这个问题,假设我确实知道我试图表达的正确类型。)
然而,any
强类型的消亡,因为每个 HTML 元素都扩展ReactElement<any, any>
,这将使我的类型() => never
。
有没有办法排除类型别名的类型SomeGenericType<any>
?
我最近一次失败的尝试IntrinsicFC
是:
type IntrinsicElement = JSX.IntrinsicElements[keyof JSX.IntrinsicElements];
type IntrinsicFC<P = void> =
((props: P) => IntrinsicElement) extends ((props: P) => JSX.IntrinsicElements[infer U & keyof JSX.IntrinsicElements])
? U extends keyof JSX.IntrinsicElements
? ((props: P) => JSX.IntrinsicElements[U])
: never
: never;
然而,这会导致type IntrinsicFC<P = {}> = never;
,因为IntrinsicElement
总是扩展,因为JSX.IntrinsicElements[keyof JSX.IntrinsicElements]
它是相同的定义。
我怀疑当 React 团队编写声明文件时,它们的意思JSX.Element
是定义为
type Element = React.ReactElement<unknown>;
但是该类型早于 TypeScript v3.0.0,它引入了unknown
type,现在更改它将是一个重大更改。但是,我只是尝试手动更改类型声明,还是不行,所以... ♀️</p>
解决方案
推荐阅读
- sql - 从 2 个常见行中获取唯一值
- scala - Scalatest - 并行套件
- spring - 为什么 keycloak.resource 不需要注册客户端的 ClientId
- .net - 从 Azure 使用 WebAPI 注销
- php - 无法从子域重定向到主域
- powershell - 如何从多台计算机收集和发送特定事件 ID(过去 24 小时)并作为电子邮件发送?
- javascript - 有没有办法使用 jasmine 单元测试来 spyOnProperty window.location.search?因为搜索是不可配置的
- python - pyplot 只显示基本图形
- java - 有没有办法通过特定的交互在多维阵列板上移动精灵?
- javascript - 为什么我的日期对象在 VSCode 中无法正确显示