React泛型类型属性必须扩展其他类型?

hlswsv35  于 2023-02-16  发布在  React
关注(0)|答案(1)|浏览(115)

我对打字脚本还不太熟悉,所以这一个让我很困惑。我想把泛型类型传递到我的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调用的时候没有传递泛型类型,它警告我必须有一个泛型类型,我可能做错了所有的事情,并且要求一些无法实现的东西,所以如果我错了,请纠正我。

8cdiaqws

8cdiaqws1#

这里有两个独立的问题:

1. <T><T extends something>的比较

我不能只把<T>设置为泛型类型,我必须把它设置为<T extends something>
.tsx文件中使用箭头函数时,这是一个语法问题,因为<T>可能会与JSX表达式混淆。如果您将箭头函数转换为传统的function声明,则可能只使用<T>而不是<T extends something>

function withHOC<T>(Component: ComponentType<T>) {
    return function (props: T) {
        return (
            <Component {...props} />
        )
    }
}

2.需要<T>

如果我不传递泛型类型(如例所示),我不会得到关于不传递泛型类型的警告。有人能解释一下为什么会发生这种情况吗?
我想让它看起来像这样...所以当我用HOC调用的时候没有传递泛型类型,它警告我必须有一个。我可能做错了所有的事情,要求一些无法实现的东西,所以如果我错了,请纠正我。
每次调用withHOC时,TypeScript都将根据调用时使用的Component参数的类型推断T的类型。
假设您有以下代码:

const Button = (props: ButtonProps) => (
    <button {...props}/>
);

const WrappedButton = withHOC(Button);

Button参数与类型ComponentType<ButtonProps>匹配,因此TypeScript确定此withHOC调用的TButtonProps

这被称为type inference,它是TypeScript的一个强大特性。
您不需要使用withHOC<ButtonProps>(Button)显式设置<T>,因为它是已知的。
可能存在一些需要显式<T>的棘手方法,但这并不是微不足道的,我不明白您为什么需要这样做。

相关问题