[React Typescript] Strongly typed HOC component
import { Router, useRouter } from "fake-external-lib";
export const withRouter = <TProps extends { router: Router }>(
Component: React.ComponentType<TPops> // React.FC<TProps>
) => {
const NewComponent = (props: Omit<TProps, "router">) => {
const router = useRouter();
return <Component {...(props as TProps)} router={router} />;
};
NewComponent.displayName = `withRouter(${Component.displayName})`;
return NewComponent;
};
const UnwrappedComponent = (props: { router: Router; id: string }) => {
return null;
};
const WrappedComponent = withRouter(UnwrappedComponent);
<>
{/* @ts-expect-error needs a router! */}
<UnwrappedComponent id="123" />
{/* Doesn't need a router passed in! */}
<WrappedComponent id="123" />
<WrappedComponent
// @ts-expect-error id must be the correct property
id={123}
/>
</>;
HOC with generic
import { Router, useRouter } from "fake-external-lib";
import { Equal, Expect } from "../helpers/type-utils";
export const withRouter = <TProps,>(
Component: (props: TProps) => React.ReactNode
): ((props: Omit<TProps, "router">) => React.ReactNode) => {
const NewComponent = (props: Omit<TProps, "router">) => {
const router = useRouter();
return <Component {...(props as TProps)} router={router} />;
};
NewComponent.displayName = `withRouter(${
(Component as { displayName?: string }).displayName
})`;
return NewComponent;
};
type TableProps<T> = {
data: T[];
renderRow: (item: T) => React.ReactNode;
router: Router;
};
export const Table = <T,>(props: TableProps<T>) => {
return <table />;
};
const WrappedTable = withRouter(Table);
<>
{/* @ts-expect-error router is required! */}
<Table
data={[1, 2, 3]}
renderRow={(row) => {
type test = Expect<Equal<typeof row, number>>;
return <tr />;
}}
/>
<WrappedTable
data={[1, 2, 3]}
renderRow={(row) => {
type test = Expect<Equal<typeof row, number>>;
return <tr />;
}}
/>
<WrappedTable
data={[1, 2, 3]}
renderRow={(row) => {
type test = Expect<Equal<typeof row, number>>;
return <tr />;
}}
/>
</>;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-08-30 [Algorithm] Three Number Sort
2022-08-30 [Typescript] Step 7. Tests for Types
2022-08-30 [Typescript] Convert a js project to typescript
2022-08-30 [Typescript] Step6: Types at Runtime
2022-08-30 [Typescript] Step5. Local types override
2017-08-30 [React & Debug] Quick way to debug Stateless component
2017-08-30 [D3] Drawing path in D3