Skip to content

Instantly share code, notes, and snippets.

@tomsseisums
Created October 19, 2020 16:14
Show Gist options
  • Save tomsseisums/947fc6351a388c546d68243f0861a4c6 to your computer and use it in GitHub Desktop.
Save tomsseisums/947fc6351a388c546d68243f0861a4c6 to your computer and use it in GitHub Desktop.
React/TypeScript Component Mapper
import { createElement } from 'react'
interface MapType {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[key: string]: (...args: any) => any
}
export default function componentMapperFactory<T extends MapType>(
contentTypeMap: T
) {
function factory<K extends keyof T>({
type,
props,
}: {
type: K
props: Parameters<T[K]>[0]
}) {
const Component = contentTypeMap[type]
if (!Component) {
return null
}
return createElement(Component, props)
}
return factory
}
import componentMapperFactory from '<path to>/componentMapperFactory'
import PictureDetail from './PictureDetail'
import CopyDetail from './CopyDetail'
import VideoDetail from './VideoDetail'
import SomeOtherDetailType from './SomeOtherDetailType'
export default componentMapperFactory({
picture: PictureDetail,
copy: CopyDetail,
video: VideoDetail,
'some-other-detail-type': SomeOtherDetailType
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment