这取决于你想对这些类型有多迂腐。通常,这些组件的使用与其他功能组件几乎相同,因此最简单的方法是将结果的类型声明为功能组件。props 的技巧是首先为 prop 类型创建一个变量并引用泛型类型的变量(或者至少,我还没有找到一种方法来让它在没有间隙值的情况下工作):
/**
* @type React.FC<ButtonPropTypes>
*/
const Button = forwardRef(({ text, icon }, ref) => (
<button ref={ref}>{text}{icon}</button>
))
const ButtonPropTypes = {
text: string.isRequired,
icon: string.isRequired,
// `ref` isn't a "real" prop, so `prop-types` will not not actually validate
// this one, but this adds it to the intellisense list if desired. Feel
// free to just omit it.
ref: oneOf(shape({ current: any }), func),
}
Button.propTypes = ButtonPropTypes
如果你想更准确,返回类型forwardRef
实际上是:
/**
* @type React.ForwardRefRenderFunction<HTMLButtonElement, ButtonPropTypes>
*/
const Button = forwardRef(({ text, icon }, ref) => (
<button ref={ref}>{text}{icon}</button>
))
const ButtonPropTypes = {
text: string.isRequired,
icon: string.isRequired,
}
Button.propTypes = ButtonPropTypes
但是,IntelliSense 似乎无法识别ref
props(工作正常,只是不在列表中)。
类型的定义在这里:https :
//github.com/DefinitelyTyped/DefinitelyTyped/blob/3423b4fc3e3da09f8acc386bc2fee6fb8f5e0880/types/react/index.d.ts#L559
第一个参数是分配给值的预期类型参考 但是,由于您实际上并没有静态地输入ref
无论如何都会传入的 ,因此您可能只是选择省略带有 的那个?
:
/**
* @type React.ForwardRefRenderFunction<?, ButtonPropTypes>
*/
我认为你对最后一部分的意思是你不会同时拥有未包装和包装的版本。这是典型的模式,因为保留两者并没有真正的用处。但是,顺便propTypes
说一句,您可以直接引用任何其他组件的值以用作泛型类型,例如:
/**
* @type React.FC<UnWrappedButton.propTypes>
*/