我对打字脚本还不太熟悉,所以这一个让我很困惑。我想把泛型类型传递到我的hoc中。我需要把组件属性作为泛型类型传递,以获得具有该类型的组件。
const withHOC = <T extends {}>(Component: ComponentType<T>) => (props: T) => {
return (
<Component {...props} />
)
}
//example: const MyView = withHoc<ViewProps>(View)
我不明白的是我不能只把<T>
设置为泛型类型,我必须把它设置为<T extends something>
。也就是说,如果我不传递泛型类型(如示例所示),我就不会得到不传递泛型类型的打印脚本警告。有人能解释一下为什么会发生这种情况吗?
我希望它看起来像这样:
const withHOC = <T>(Component: ComponentType<T>) => (props: T) => {
return (
<Component {...props} />
)
}
所以当我用HOC调用的时候没有传递泛型类型,它警告我必须有一个泛型类型,我可能做错了所有的事情,并且要求一些无法实现的东西,所以如果我错了,请纠正我。
1条答案
按热度按时间8cdiaqws1#
这里有两个独立的问题:
1.
<T>
与<T extends something>
的比较我不能只把
<T>
设置为泛型类型,我必须把它设置为<T extends something>
。在
.tsx
文件中使用箭头函数时,这是一个语法问题,因为<T>
可能会与JSX表达式混淆。如果您将箭头函数转换为传统的function
声明,则可能只使用<T>
而不是<T extends something>
。2.需要
<T>
如果我不传递泛型类型(如例所示),我不会得到关于不传递泛型类型的警告。有人能解释一下为什么会发生这种情况吗?
我想让它看起来像这样...所以当我用HOC调用的时候没有传递泛型类型,它警告我必须有一个。我可能做错了所有的事情,要求一些无法实现的东西,所以如果我错了,请纠正我。
每次调用
withHOC
时,TypeScript都将根据调用时使用的Component
参数的类型推断T
的类型。假设您有以下代码:
Button
参数与类型ComponentType<ButtonProps>
匹配,因此TypeScript确定此withHOC
调用的T
为ButtonProps
。这被称为type inference,它是TypeScript的一个强大特性。
您不需要使用
withHOC<ButtonProps>(Button)
显式设置<T>
,因为它是已知的。可能存在一些需要显式
<T>
的棘手方法,但这并不是微不足道的,我不明白您为什么需要这样做。