【发布时间】:2022-02-03 20:25:41
【问题描述】:
我用这个基本概念的更复杂的版本问这个问题
联系方式:Can Generic JSX.Elements work in Typescript
我把它缩小到核心元素:
这是Object A,它从TypeA获取参数
type TypeA = {
label: string
value: number
}
const ObjA = ({ label, value }:TypeA) => {
return <div>
<div>Label: {label}</div>
<div>Value: {value}</div>
</div>
}
这是Object B,它从TypeB获取参数
type TypeB = {
label: string
value: string
bool: boolean
}
const ObjB = ({ label, value, bool }:TypeB) => {
return <div>
<div>Label: {label}</div>
{bool && <div>Value: {value}</div>}
</div>
}
现在我在一个数组中收集这个 ComponentGroup 并从这个数组中创建一个类型:
const ComponentCollection = [
ObjA,
ObjB
] as const
type Components = typeof ComponentCollection[number]
然后我创建一个通用组件:
interface GenericProps<T extends Components> {
Component: T
title: string
}
const Generic = <T extends Components,>({ Component, title, ...props }:GenericProps<T>) => {
return (
<div>
<label>{title}</label>
<Component {...props}/>
</div>
)
}
最后我可以调用通用组件如下:
<Generic Component={ObjA} title={'Usage A'} label={'Object A'} value={'String A'}/>
<Generic Component={ObjB} title={'Usage B no Bool'} label={'Object B'} value={0}/>
<Generic Component={ObjB} title={'Usage B with Bool'} label={'Object B'} value={0} bool/>
虽然它在 JavaScript 中运行得非常好,但我在打字时搞砸了。
我设置了一个 TS-Playground 和一个 Codepen:
TS-游乐场:https://tsplay.dev/WvVarW
代码笔:https://codepen.io/Cascade8/pen/eYezGVV
目标:
- 将此代码转换为正确的 TypeScript 代码
- 编译时没有任何 TS 错误或
/@ts-ignore - 使 IntelliSense 工作,因此如果您键入
<Generic Component={ObjA} ...,它将显示此对象的可用类型属性。在这种情况下:label={string: } value={string: }
我不想要的:
- 使用类或旧的函数语法,因为我们的 EsLint 要求我们尽可能使用箭头函数。
- 将对象作为子对象传递。
我知道这行得通,但它不是首选的解决方案,因为主项目有很多这样的组会像这样渲染。
以及为什么在 JavaScript 中运行非常简单的 TypeScript 不能运行。
【问题讨论】:
标签: javascript reactjs typescript typescript-generics react-tsx