首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在React.memo中使用带有泛型的属性

如何在React.memo中使用带有泛型的属性
EN

Stack Overflow用户
提问于 2020-02-25 10:17:22
回答 4查看 3.3K关注 0票数 2

我正在尝试将以下代码转换为使用React.memo

代码语言:javascript
复制
interface Props<TRowData> {
  // props...
}

export function Table<TRowData>({
  propA,
  propB
}: Props<TRowData>) {

}

就像这样(不正确):

代码语言:javascript
复制
interface Props<TRowData> {
  // props...
}



export const Table = memo<Props<TRowData>>(
({
  propA,
  propB
}) => {

})

如何更正此语法?目前它有这个错误:

代码语言:javascript
复制
// Cannot find name 'TRowData'.
export const Table = memo<Props<TRowData>>(
                                ~~~~~~~~
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-02-25 15:03:40

使用当前的React类型声明,不可能在React.memo之外创建泛型组件。没有类型断言的解决方案是添加额外的memo函数重载以利用TS3.4 higher order function type inference

代码语言:javascript
复制
import React, { memo } from "react"

declare module "react" { // augment React types
  function memo<A, B>(Component: (props: A) => B): (props: A) => ReactElement | null
  // return type is same as ReturnType<ExoticComponent<any>>
}

然后,您将能够使Table组件成为泛型。只需确保将泛型函数传递给memo

代码语言:javascript
复制
interface Props<T> {
  a: T
}

const TableWrapped = <T extends {}>(props: Props<T>) => <div>{props.a}</div>

const Table = memo(TableWrapped)

const App = () => (
  <>
    <Table a="foo" /> {/* (props: Props<string>) => ... */}
    <Table a={3} /> {/* (props: Props<number>) => ... */}
  </>
)

Playground

票数 7
EN

Stack Overflow用户

发布于 2020-02-25 11:04:25

我通过将其保留为一个函数来解决它,将该函数重命名为TableComponent并执行以下操作:

代码语言:javascript
复制
export const Table = memo(TableComponent) as typeof TableComponent

编辑,这也行得通:

代码语言:javascript
复制
const typedMemo: <T>(c: T) => T = React.memo
export const Table = typedMemo(TableComponent)
票数 6
EN

Stack Overflow用户

发布于 2020-02-25 11:00:57

您不需要将组件作为React.memo的第一个参数传递吗?我不能测试它,但我觉得这是思考的过程:

代码语言:javascript
复制
// Overall format:
export const Table = memo(MyComponent, MyFunction)

// With empty arrow function:
export const Table = memo(MyComponent, () => {})

// With your code:
export const Table = memo(MyComponent, ({propA, propB}: Props<TRowData>) => {

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

https://stackoverflow.com/questions/60386614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档