[英]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.