我创建了一个函数来记忆上下文值,并在React中将它们作为渲染props 返回,以避免在我不关心的值更改时重新渲染.(这很好用!)然而,我打字有困难.
目标是使子函数的类型与访问器的返回类型相同.
我遇到很多麻烦的部分是键入以下部分:
type ContextType = {
state:{ a:number; b:number; }
otherStuff:{ a:string; b:string }
}
export const ContextAccessor: <
T extends {
accessor: (ctx: ContextType) => ReturnType<T["accessor"]>;
children: (ctx: ReturnType<T["accessor"]>) => JSX.Element;
}
>(
args: T
) => JSX.Element = ({ children, accessor }): JSX.Element =>
我的访问器函数被输入为accessor: (ctx: ContextType) => any
,这使得函数children
也有一个任意类型的输入参数.
我认为这是因为ReturnType<T["accessor"]>
实际上不起作用
完整代码(无备忘录)如下:
type ContextType = {
state:{ a:number; b:number; }
otherStuff:{ a:string; b:string }
}
export const ContextAccessor: <
T extends {
accessor: (ctx: ContextType) => ReturnType<T["accessor"]>;
children: (ctx: ReturnType<T["accessor"]>) => JSX.Element;
}
>(
args: T
) => JSX.Element = ({ children, accessor }): JSX.Element => {
const { state, modifiers, accessors } = useMyContext();
const accessed = useMemo(
() => accessor({ state, modifiers, accessors }),
[state, modifiers, accessors]
);
return children(accessed)
};
export const Test = () => {
return (
<ContextAccessor accessor={(ctx) => ctx.state.a}>
{(transfer) => (
<div>
<div>{JSON.stringify(transfer)}</div>
</div>
)}
</ContextAccessor>
);
};
编辑我try 过的更多东西
我认为下面的方法不管用,因为ReturnType<Props<T>["accessor"]>
被输入为未知,不是泛型.
type Props<T> = {
accessor: (context: ContextType) => unknown;
children: (ctx: ReturnType<Props<T>["accessor"]>) => JSX.Element;
};
export function StagingBuilderContext<T>(props: Props<T>): JSX.Element {