javascript - 如何在 typescript 中扩展 React 类

标签 javascript reactjs typescript

这是一个简单的例子:

interface BaseProps {
    name: string;
}

class BaseClass<P extends BaseProps> extends React.Component<P, void> {

}

interface SuperProps {

}

class SuperClass extends BaseClass<SuperProps> {

} 

我希望 SuperClass 默认有 this.props.name。但现在,我遇到编译错误,提示 Type 'SuperProps' does not satisfy the constraint 'BaseProps'.Property 'name' is missing in type 'SuperProps'。

我做错了什么?我意识到我可以做 SuperProps extends BaseProps 但这在这里似乎是多余的。

最佳答案

class BaseClass<P extends BaseProps> extends React.Component<P, void>

哪里<P extends BaseProps>表示扩展 BaseProps 的任何有效类型可分配给 BaseClass .这就是泛型的工作原理。

现在,当你这样做的时候

interface SuperProps {

}

class SuperClass extends BaseClass<SuperProps> {

} 

您正在分配类型 SuperProps不扩展 BaseProps .这就是您收到错误的原因。

如您所说,要克服错误,您要么需要扩展 BaseProps接口(interface),或者您可以使用交集类型。如果您使用交集类型,那么完整的示例将如下所示:

export interface BaseProps {
    name: string;
}

class BaseClass<P> extends React.Component<P & BaseProps, void> {

}

interface SuperProps {

}

class SuperClass extends BaseClass<SuperProps> {
    render(): JSX.Element {
        return (
            <div>
                {this.props.name} {/* Won't throw an error*/}
            </div>
        );
    }
}

您可以阅读有关高级类型的更多信息 here .

关于javascript - 如何在 typescript 中扩展 React 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43817597/

相关文章:

javascript - 页面上有多个相同的 'angular app' 副本

javascript - 每个用户仅显示一次弹出窗口

javascript - 带有按钮的 JQuery 列表函数

javascript - 如何使用钩子(Hook)切换 React 组件与 Redux?

javascript - react-stripe-elements 没有检测到 Stripe.js

reactjs - 属性 '[Symbol.observable]' 在类型 'Store<ApplicationState>' 中缺失,但在类型 'Store<any, AnyAction>' 中需要。 TS2741

javascript - react + typescript : Property * is missing in type *

javascript - 如何通过Express JS服务器将React JS和Socket IO连接在一起?

javascript - Angular 12+ : Is there a Simple way to apply display mask/pipe for Reactive Form?

reactjs - 处理未定义声明文件的正确方法 (index.d.ts)