首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >React:通过HOC注入道具,而不声明它们的类型。

React:通过HOC注入道具,而不声明它们的类型。
EN

Stack Overflow用户
提问于 2020-05-13 10:20:10
回答 2查看 732关注 0票数 7

我试着在redux绑定中做一些connect()。下面是我在组件中注入道具的特例:

代码语言:javascript
运行
AI代码解释
复制
export function withAdditionalProps<T, I>(
  injectedProps: I,
  WrappedComponent: React.ComponentType<T>,
): React.ComponentType<Omit<T, keyof I>> { ... }

如果我声明注入的道具类型(I泛型),它可以正常工作,但如果我想在不声明这些类型的情况下执行临时操作(省略动态注入的道具键),该怎么办?如何从传递的道具中确定钥匙?举个例子,我试过这样的方法:

代码语言:javascript
运行
AI代码解释
复制
export function withAdditionalProps<T>(
  injectedProps: { [key: string]: unknown },
  WrappedComponent: React.ComponentType<T>,
): React.ComponentType<Omit<T, keyof typeof injectedProps>> { ... }

const InjectedComponent = withAdditionalProps<AppState>(
  {
     counter: 0
  },
  (props) => (<div>{props.counter}</div>)
);

但是它不正确:编译器在呈现组件时会抛出一个错误。查看屏幕截图(testProp是组件的“原生”支柱)

也许任何人都能帮我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-03 05:13:09

简而言之,你的第二个例子在打字稿中是不可能的。

问题是,{ [key:string]: unknown }类型总是将所有可能的字符串作为键捕获,而不是缩小到在特定调用中使用的具体字符串,这将使在这里使用Omit成为可能。

实际上,与Omit一起使用的{ [key:string]: unknown }只是省略了所有可能的键,因此忽略了T中的所有本机道具。这在将来可能通过否定类型特性实现,但目前唯一的方法是通过声明的类型变量,如第一个示例所示。

但是,函数定义中声明的类型变量并不要求您也为每个调用声明它们。参见下面的代码-编译器将从调用函数时传递的具体参数推断TI。因此,在实践中,这里唯一的区别在于您的特定类型定义,而且老实说,无论哪种方式,它似乎都是类似的工作/可读性。

代码语言:javascript
运行
AI代码解释
复制
function foo<T, I>(t: T, i: I): Omit<T, keyof I> { 
    return { ...t, ...i }
}

// notice explicitly declaring foo<{ a: number, b: number}, { c: number }> 
// is NOT necessary. The correct types are just inferred from the args you pass.
const bar = foo({ a: 1, b: 2 }, { b: 3 })

bar.a // OK
bar.b // ERROR, since b is omitted
票数 2
EN

Stack Overflow用户

发布于 2020-06-05 07:24:06

如果在泛型参数中同时捕获组件的Props类型和注入的支持类型,则可以完成以下工作:

代码语言:javascript
运行
AI代码解释
复制
export function withAdditionalProps<C extends unknown, I extends object>(
  injectedProps: I,
  WrappedComponent: React.ComponentType<C>,
): React.ComponentType<Omit<C, keyof I>> {
  // ...
}

与其将AppState作为泛型参数传递,不如确保TypeScript有足够的上下文来推断它。您可以通过在包装组件中声明AppState来做到这一点:

代码语言:javascript
运行
AI代码解释
复制
interface AppState {
  counter: number;
}

const InjectedComponent = withAdditionalProps(
  {
    counter: 0,
  },
  (props: AppState) => <div>{props.counter}</div>,
);

const el = <InjectedComponent />;  // OK

const InjectedComponent2 = withAdditionalProps(
  {
    counter2: 0,
  },
  (props: AppState) => <div>{props.counter}</div>,
);

const el2 = <InjectedComponent2 />; // error: Property 'counter' is missing

TypeScript 不会让您指定某些泛型参数,但会让其他参数推断.如果您想通过泛型传递AppState,标准的解决方法是使用两个函数,一个函数具有显式泛型参数,另一个函数具有推断参数。在您的示例中,如下所示:

代码语言:javascript
运行
AI代码解释
复制
export function withAdditionalProps<PropsType>(): <I extends unknown>(
  injectedProps: I,
  WrappedComponent: React.ComponentType<PropsType>,
) => React.ComponentType<Omit<PropsType, keyof I>> {
  // ...
}

下面是你如何使用它:

代码语言:javascript
运行
AI代码解释
复制
interface AppState {
  counter: number;
}
const InjectedComponent = withAdditionalProps<AppState>()({
    counter: 0,
  },
  props => <div>{props.counter}</div>,
);

const el = <InjectedComponent />;  // OK

const InjectedComponent2 = withAdditionalProps<AppState>()(
  {
    counter2: 0,
  },
  props => <div>{props.counter}</div>,
);

const el2 = <InjectedComponent2 />; // error: Property 'counter' is missing

我不太清楚在你的截图中错误信息背后是怎么回事。如果你能分享文本或链接,我可以看一看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61782009

复制
相关文章
React 高阶HOC (一)
高阶组件 (HOC) 是 React 中用于重用组件逻辑的高级技术。HOC 本身并不是 React API 的一部分。它们是从 React 的组合性质中出现的一种模式。
ronixiao
2022/08/08
8490
React 高阶HOC (一)
React高阶组件HOC的使用
高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。 高阶组件只提供逻辑代码 视图代码会做为参数传递给高阶组件进行渲染
明知山
2021/10/25
1K0
React高阶组件HOC的使用
React 高阶组件HOC
概述 高阶组件( higher-order component ,HOC )是 React 中复用组件逻辑的一种进阶技巧,通俗的讲,高阶组件就是一个 React 组件包裹着另外一个 React 组件。它本身并不是 React 的 API,而是一种 React 组件设计理念,众多的 React 库已经证明了它的价值,例如耳熟能详的 react-redux。 高级组件使用函数来实现,基本上是一个类工厂,它的函数签名可以用类似 haskell 的伪代码表示: hocFactory:: W: React.Com
xiangzhihong
2018/02/06
1.7K0
通过 React Hooks 声明式地使用 setInterval
本文就来探索一下,如何让 setInterval 和 Hooks 和谐地玩耍,为什么是这种方式,以及这种方式给你带来了什么新能力。
小芭乐
2019/02/20
7.6K3
通过 React Hooks 声明式地使用 setInterval
React系列-Mixin、HOC、Render Props
在讲react-hooks之前,我们来捋捋react状态逻辑复用相关知识点,这会帮助你理解hooks
落落落洛克
2021/01/08
2.4K0
React系列-Mixin、HOC、Render Props
「react进阶」一文吃透React高阶组件(HOC)
React高阶组件(HOC),对于很多react开发者来说并不陌生,它是灵活使用react组件的一种技巧,高阶组件本身不是组件,它是一个参数为组件,返回值也是一个组件的函数。高阶作用用于强化组件,复用逻辑,提升渲染性能等作用。高阶组件也并不是很难理解,其实接触过后还是蛮简单的,接下来我将按照,高阶组件理解?,高阶组件具体怎么使用?应用场景, 高阶组件实践(源码级别) 为突破口,带大家详细了解一下高阶组件。本文篇幅比较长,建议收藏观看
用户6835371
2021/06/01
2.2K0
「react进阶」一文吃透React高阶组件(HOC)
Ad-hoc类型同步识别
尽管之前的我们提出的动态数据竞争验证和检测方法能够比较精确地找到数据竞争,但是该方法还是会存在一部分误检,误检主要就是由于ad-hoc类型的同步引起的,下图展示了两个例子。
chain
2018/06/12
1.2K0
React TS 解决不声明变量类型时的报错问题
使用 TypeScript 的 React 项目中,变量如果没有声明任何类型,会被识别为 any,此时编译器会报错,要求强制给变量声明类型
Leophen
2021/07/08
1.8K0
React 条件渲染最佳实践(7 种方法)
在 React 中,条件渲染可以通过多种方式,不同的使用方式场景取决于不同的上下文。在本文中,我们将讨论所有可用于为 React 中的条件渲染编写更好的代码的方法。
秋风的笔记
2020/10/27
5.9K0
React篇(048)-什么是高阶组件(HOC)?
高阶组件(HOC) 就是一个函数,且该函数接受一个组件作为参数,并返回一个新的组件,它只是一种模式,这种模式是由react自身的组合性质必然产生的。
齐丶先丶森
2022/05/12
4820
【19】进大厂必须掌握的面试题-50个React面试
这是最有可能由面试官提出的 常被问到的50个React面试问答。为了方便您访问,我对React面试问题进行了归类:
全栈程序员站长
2021/04/07
11.5K0
React组件复用的发展史
React MiXin只能通过React.createClass()来使用,如下:
夏天的味道123
2022/10/03
1.4K0
React的组件复用的发展史
React MiXin只能通过React.createClass()来使用,如下:
夏天的味道123
2022/12/07
1.6K0
【译】三分钟掌握 React 高阶组件
高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。
桃翁
2019/06/18
5950
vue和react的区别
React默认是通过比较引用的方式(diff)进行的,如果不优化可能导致大量不必要的VDOM的重新渲染。为什么React不精确监听数据变化呢?这是因为Vue和React设计理念上的区别,Vue使用的是可变数据,而React更强调数据的不可变,两者没有好坏之分,Vue更加简单,而React构建大型应用的时候更加鲁棒。
扬起
2022/06/28
6830
vue和react的区别
我的react面试题整理2(附答案)
增加dangerouslySetInnerHTML属性,并且传入对象的属性名叫_html
beifeng1996
2022/11/15
4.5K0
React面试八股文(第二期)
React.forwardRef 会创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见,但在以下两种场景中特别有用:
beifeng1996
2022/10/19
1.6K0
前端技能树,面试复习第 19 天—— React 基础一点通
React 并不是将 click 事件绑定到了 div 的真实 DOM 上,而是在 document 处监听了所有的事件,当事件发生并且冒泡到 document 处的时候,React 将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。
前端修罗场
2023/10/07
3550
前端技能树,面试复习第 19 天—— React 基础一点通
前端-关于 Vue 和 React 区别的一些笔记
这篇文章记录我在使用Vue和React的时候,对他们的不同之处的一些思考,不仅局限于他们本身,也会包括比如 Vuex/Redux 等经常搭配使用的工具。因为涉及到的内容很多,可能下面的每一个点都能写成一篇文章,这次先简单做一个概要,等我有空做一个详细的专题出来。
grain先森
2019/03/29
6K0
前端-关于 Vue 和 React 区别的一些笔记
React-代码复用(mixin.hoc.render props) 前言例子MixinHOCRender Props总结参考
最近在学习React的封装,虽然日常的开发中也有用到HOC或者Render Props,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~
菜的黑人牙膏
2019/04/09
1.6K0
React-代码复用(mixin.hoc.render props)
		前言例子MixinHOCRender Props总结参考

相似问题

如何在react-typescript的HOC中设置道具类型?

16

Typescript HOC -需要React组件上的道具

111

通过带有HOC的路径传递道具

35

通过所有道具的HOC

14

通过hoc从子组件获取道具

215
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档