[英]How to use Props with Generics with React.memo
我正在尝试将以下内容转换为使用React.memo
:
interface Props<TRowData> {
// props...
}
export function Table<TRowData>({
propA,
propB
}: Props<TRowData>) {
}
像这样(不正确):
interface Props<TRowData> {
// props...
}
export const Table = memo<Props<TRowData>>(
({
propA,
propB
}) => {
})
如何更正此语法? 目前它有这个错误:
// Cannot find name 'TRowData'.
export const Table = memo<Props<TRowData>>(
~~~~~~~~
使用当前的 React 类型声明,不可能从React.memo
创建通用组件。 没有类型断言的解决方案是添加额外的memo
函数重载以利用 TS 3.4 高阶函数类型推断:
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
:
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>) => ... */}
</>
)
我通过将其保留为函数来解决它,将函数重命名为TableComponent
并执行以下操作:
export const Table = memo(TableComponent) as typeof TableComponent
编辑,这个也有效:
const typedMemo: <T>(c: T) => T = React.memo
export const Table = typedMemo(TableComponent)
你不需要传递一个组件作为React.memo
的第一个参数吗? 我无法测试它,但我觉得这是思考过程:
// 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>) => {
})
简单,只需将一个非箭头函数传递给React.memo
:
export const Table = React.memo(function<T>(props: Props<T>) {
})
或者如果您需要默认导出:
export default React.memo(function Table<T>(props: Props<T>) {
})
编辑:您可以检查这是否适用于以下代码:
type MyProps<T> = {someField: T};
const MyComponent = React.memo(function <T>({someField}: MyProps<T>) {
return <div>{someField}</div>
});
<MyComponent someField={222} />;
<MyComponent someField={'MYSTRING'} />;
const element = React.createElement(MyComponent, {someField: 22});
element
类型是
React.FunctionComponentElement<{someField: number}>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.