[React Typescript] Strongly type Shared props for multiple components (React.FC<propsType>)
import { Equal, Expect } from "../helpers/type-utils";
type InputProps = React.ComponentProps<"input">;
const COMPONENTS = {
text: (props) => {
return <input {...props} type="text" />;
},
number: (props) => {
return <input {...props} type="number" />;
},
password: (props) => {
return <input {...props} type="password" />;
},
} satisfies Record<string, (props: InputProps) => JSX.Element>;
export const Input = (
props: Record<"type", keyof typeof COMPONENTS> & InputProps
) => {
const Component = COMPONENTS[props.type];
return <Component {...props} />;
};
<>
<Input
type="number"
onChange={(e) => {
// e should be properly typed!
type test = Expect<Equal<typeof e, React.ChangeEvent<HTMLInputElement>>>;
}}
></Input>
<Input type="text"></Input>
<Input type="password"></Input>
{/* @ts-expect-error */}
<Input type="email"></Input>
</>;
- Get the props for
input
, we can usingReact.ComponentProps<"input">
- Improve:
(props: InputProps) => JSX.Element
toReact.FC<InputProps>
const COMPONENTS = {
text: (props) => {
return <input {...props} type="text" />;
},
number: (props) => {
return <input {...props} type="number" />;
},
password: (props) => {
return <input {...props} type="password" />;
},
} satisfies Record<string, React.FC<InputProps>>;
【推荐】国内首个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-29 [Typescript] Step 4. ESLint for Typescript
2022-08-29 [Typescript] Step 3. Turn on "noImplicitAny" and even more strict mode
2022-08-29 [Typescript] Step1 & 2 for converting a js app to ts
2019-08-29 [React + GraphQL] Use useLazyQuery to manually execute a query with Apollo React Hooks
2019-08-29 [CSS] Conditionally Assign Style to a Parent Element with Focus-Within Pseudo-class
2019-08-29 [Angular 8] Calculate and Measure Performance budgets with the Angular CLI
2019-08-29 [Angular 8] Custom Route Preloading with ngx-quicklink and Angular