Typescript `typeof React.Component` 不扩展接口?定义高阶组件时遇到问题

2024-04-19

我正在创建一个高阶组件来包装扩展接口的组件:

interface ClickOutsideInterface {
  onClickOutside: (e: Event) => void
}

我创建的工厂期望React.ComponentClass实施ClickOutsideInterface:

  function clickOutside<P>(Component: React.ComponentClass<P> & ClickOutsideInterface){    
    return class ClickOutside extends React.Component<P, {}> { 
      /* on click outside invoke Component.onClickOutside  */

      render() {
        return(<div><Component {...this.props} /></div>)
      }
   }
}

为了测试工厂,我实现了一个扩展的组件ClickOutsideInterface

class Test extends React.Component<TProps, TState> implements ClickOutsideInterface {
  onClickOutside(event: Event): void {
    this.setState({
      closed: true
    })
  }

  render(){
    return(
      <div>{this.state.closed}</div>
    )
  }
}

但是当我在函数中使用组件作为参数时clickOutside:

const withClickOutside = clickOutside(Test)

我收到以下参数类型错误Test:

“typeof Test”类型的参数不可分配给类型参数 “组件类和 ClickOutsideInterface”。类型“typeof Test”是 无法分配给键入“ClickOutsideInterface”。 类型“typeof Test”中缺少属性“onClickOutside”。

为什么 Typescript 认为我没有实现该接口的任何想法Test?


TypeScript 表示您尚未实现函数参数所需的接口,因为您确实没有实现。

当你写的时候

class A {
  //...
}

您定义两种类型和一种值。

The value,它被命名为A,是班级。这是您调用的函数new创建对象。

首先type,也被命名为A,是对象的类型created通过调用类函数new如上所述。

第二type是该类函数的类型。声明类不会自动为该类型创建名称,但该类型仍然存在,因为所有值都有类型。这个类型是这样写的typeof A因为它是值的类型A,类的类型。

因此,根据您想要实现的目标,您需要

传递一个实例Test

const withClickOutside = clickOutside(new Test);

或者更改您的函数,以便它采用与类本身的类型匹配的对象,而不是它创建的对象

function clickOutside<P>(
  Component: new () => React.ComponentClass<P> & ClickOutsideInterface
) {...}

我怀疑在这种情况下你想要的是后者。

最后,虽然您可能希望将其用于文档目的,这是完全有效的,但我想指出,没有理由实际声明您的类甚至根本实现了该接口。 TypeScript 是一种结构类型语言,所有接口都是通过具有兼容的成员来实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript `typeof React.Component` 不扩展接口?定义高阶组件时遇到问题 的相关文章

随机推荐

  • 没有什么可以帮助解决 Qt 中的“对 vtable 的未定义引用”

    我无法构建此错误 未定义对 CustomUndoStack 的 vtable 的引用 这是代码 class CustomUndoStack public QObject Q OBJECT public int main int argc c
  • ANSI SQL 问题 - 如果记录已存在,如何插入或更新记录?

    虽然我 目前 使用 mySQL 但我不需要任何数据库特定的 SQL 我试图插入一条记录 如果不存在 并更新一个字段 如果存在 我想使用 ANSI SQL 该表看起来像这样 create table test table id int nam
  • Greasemonkey:XPath 未返回 .xhtml 页面的结果

    在 xhtml 页面上运行时 xpath 似乎没有返回任何结果 var result document evaluate a img document body null XPathResult ORDERED NODE SNAPSHOT
  • 在 Windows Azure 上使用quartz.net

    我在我的 asp net 应用程序中使用quartz net 当我在本地主机上运行时 quartz 调度程序可以工作 但是当我将站点发布到 windows azure 时 它 不再工作 任何帮助将非常感激 问题不在于它没有在天蓝色站点上运行
  • /etc/fstab 中的动态 IP

    我正在尝试在 AWS 中使用弹性文件系统 EFS 我的目标是使用 etc fstab 自动挂载它 由于 EC2 实例会跨可用区域自动扩展 因此 EFS 挂载 IP 会根据实例的区域而变化 目前AWS提供了这个命令来将其安装到正确的区域 su
  • C++/CLI:#pragma 托管/非托管范围

    我有一个混合模式 DLL 其中有一个包含托管和非托管代码的 cpp 文件 一个简化的重现示例如下所示 include stdafx h pragma managed Just for explicitness doesn t influen
  • 如何从 launch.json 传递带有特殊字符的参数?

    我试图通过 launch json 将参数传递给我的 Python 程序 并且我的参数之一需要特殊字符 因为它是密码 我计划添加更安全的方式来输入密码 但这不是重点 这是我的 launch json 密码已更改 但仍带有特殊字符 Use I
  • 通过 Paramiko SSH 的 SQLAlchemy

    我的服务器上有一个数据库 我需要通过 SSH 访问该数据库 现在我通过使用命令行来获取数据来处理数据库 import paramiko ssh paramiko SSHClient ssh set missing host key poli
  • Mockito 并不是在嘲笑电话

    我正在测试的功能之一是通过 ssh 登录到一台机器 我想模拟 ping 方法 它实际上尝试 ssh 进入机器 因为我并没有真正 ssh 进入机器 我正在测试的类 public class TestMachine public int pin
  • 如何阻止UITextView进入时向上滚动

    我有一个UITextView包含在一个UITableViewCell 最初显示视图时布局是正确的 但是一旦我单击UITextView它会自动向上滚动一点 第一行的上半部分字符变得不可见 这张图是当UITextView不活跃 UITextVi
  • NSDateFormatter 获取 Null

    我在我的项目中得到一个字符串 我将字符串传递给 dateFormatter 但我得到 nil 在字符串中而不是IST我可能会得到PDT我可能会得到任何其他格式 NSString currentDateString 2012 11 09 12
  • 分割scrapy的大CSV文件

    是否可以使 scrapy 写入每个不超过 5000 行的 CSV 文件 我怎样才能给它一个自定义的命名方案 我应该修改吗CsvItemExporter 尝试这个管道 coding utf 8 Define your item pipelin
  • “setIndentationLeft”不是“iTextsharp.text.Paragraph”的成员

    我正在添加出现错误的段落 p setindentationLeft 不是 itextsharp text paragraph 的成员 Dim bf As BaseFont BaseFont CreateFont Dim p As New P
  • MVC WebGrid 是开源的吗?

    MVC WebGrid 是开源的吗 如果可以的话哪里可以找到源代码 当前版本的 WebGrid 几乎没有文档 实现不完整等 我正在尝试做一件简单的事情 即向视图中的 WebGrid Column 添加可见性属性 但这是不可能的 您可以下载A
  • 如何在字符串中使用变量

    我正在尝试在字符串中实现变量 我已经搜索过这个并尝试向它扔不同的东西 但似乎没有任何效果 我有一个如下所示的变量 http localhost 8080 Editor name Default 我使用以下方法获取值没有问题 function
  • Dataflow 2.1.0 中是否有 IntrabundleParallelization 的替代方案?

    根据 dataflow 2 X 的发行说明 IntraBundleParallelization 已被删除 有没有办法控制 增加数据流 2 1 0 上 DoFns 的并行度 当我在 1 9 0 版本的数据流上使用 IntrabundlePa
  • 带百分比的 CSS 位置

    我在另一个 div 中相对位置 div 时遇到问题 我想制作一个位于屏幕水平中间的 div 并在这个 div 中我想放置 3 个具有相同高度的其他 div 但他们所有人都应该做出反应 图片胜于雄辩 div div class row div
  • 警告似乎指向不同的对象地址

    我正在使用 PySide 当我尝试将电子表格设置为某个小部件时收到警告 09 18 14 48 54 107 WARNING D 0x7ff4a0074650 qt Could not parse stylesheet of widget
  • Python os.chdir() 似乎不起作用

    我似乎无法更改 python 中的目录 import os os getcwd C Users Jon Folder IdbyGenotype os chdir r C Users Jon Folder IdbyGenotype thiso
  • Typescript `typeof React.Component` 不扩展接口?定义高阶组件时遇到问题

    我正在创建一个高阶组件来包装扩展接口的组件 interface ClickOutsideInterface onClickOutside e Event gt void 我创建的工厂期望React ComponentClass实施Click