TS(2352) 声明具有动态属性的对象和一个具有特定类型的属性

2023-12-11

我需要创建一个对象,该对象将包含一个名为“state”的属性,该属性将具有通用类型,所有其他属性将是具有覆盖上下文的函数。我不确定这是否可能,因此我决定写在这里。

我有一个代码:

declare interface ContextModule<State> {
  state: State
}

export declare interface SuperModule<State = any> {
  state?: State | any,
  [methodName: string]: (this: ContextModule<State>, ...args: any[]) => any
}

const lol = {
  getFoo (): any {
    return this.state.foo
  }
} as SuperModule

在这段代码中我没有任何错误。它执行成功,但如果我添加

declare interface ContextModule<State> {
  state: State
}

export declare interface SuperModule<State = any> {
  state?: State | any,
  [methodName: string]: (this: ContextModule<State>, ...args: any[]) => any
}

const lol = {
  getFoo (): any {
    return this.state.foo
  },
+  state: {       // added this property
+    foo: 'string'
+  }
} as SuperModule

然后我会看到输出

Conversion of type '{ getFoo(this: ContextModule<any>): any; state: { foo: string; }; }' to type 'SuperModule<any>' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
  Property 'state' is incompatible with index signature.
    Type '{ foo: string; }' is not comparable to type '(this: ContextModule<any>, ...args: any[]) => any'.
      Type '{ foo: string; }' provides no match for the signature '(this: ContextModule<any>, ...args: any[]): any'.ts(2352)

我了解该问题与尝试转换属性的 TypeScript 有关state to [methodName: string]: (this: ContextModule<State>, ...args: any[]) => any,但是为什么如果我在声明动态属性之前声明这个属性

可能有人看到了同样的问题。希望得到您的帮助,谢谢!


我可以让它干净地工作的唯一方法是使用交集类型,但似乎动态类型和具有固定属性的类型(与动态道具的类型不同)的交集只能使用以下命令创建Object.assign.

这是我的简化示例,说明了它是如何工作的:

interface MyType {
    requiredProp1: string
}
interface MyOtherType{
    [key: string]: number
}
type ISect = MyType & MyOtherType

const obj: ISect = Object.assign({ requiredProp1: "ff" }, { foo: 1 })

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

TS(2352) 声明具有动态属性的对象和一个具有特定类型的属性 的相关文章

随机推荐

  • 如何使用充满测试用例的输入文件来测试 Python 脚本?

    我正在参加在线法官竞赛 我想使用充满测试用例的 in 文件来测试我的代码 以对我的算法进行计时 如何让我的脚本从此 in 文件获取输入 所以脚本通常从 stdin 获取测试用例 现在您想使用文件中的测试用例进行测试 如果是这种情况 请使用
  • Oracle SQL-Loader 有效处理值中的内部双引号

    我遇到了一些 Oracle SQL Loader 挑战 正在寻找一种高效且简单的解决方案 我要加载的源文件是管道 分隔 其中值用双引号括起来 问题似乎是某些值包含内部双引号 e g a b 这导致我的记录被拒绝 理由是 no termina
  • 辅助服务的“onAccessibilityEvent”函数未被调用

    我正在开发的应用程序遇到了一个相当不幸的问题 该应用程序利用辅助功能服务在通知到达用户设备时对通知进行一些特殊处理 问题是 它工作得很好 但服务的 onAccessibilityEvent 函数从未被调用unless该服务是从 Androi
  • Karate-有什么不丑陋的方式来发送每个请求主体字段都包含格式错误的 API 请求吗?

    我有一个奇怪的问题 我已经有了解决方案 但它非常丑陋 我想知道是否有更好的方法通过空手道或 JS 来做到这一点 我对这两方面都是新手 所以请耐心等待 我正在发送一个带有相当大的请求正文 总共 19 个字段 的 POST 调用 我必须有目的地
  • 嵌套 if 在 php 中不起作用要么不执行任何操作,要么转到代码末尾

    几个小时以来 我一直对这段代码感到沮丧 我只能低头寻求一些帮助 我试图让这些嵌套的 if 工作 但它要么不返回任何内容并且我没有收到任何错误 要么它会到达编码的末尾 它应该事先停止 这些输入均来自组单选按钮 其顺序的原因是 一旦到达正在调用
  • 访问 Vue JS 实例监视对象中的 $refs 数组

    我正在构建一个Vue JSSPA 还有Vuetify 数据表在 v app 内部 我试图在里面设置一个变量观察对象为了FilteredItems 计算属性在数据表内 但我不确定如何访问 refs数组实例内部 我知道可以通过以下方式在实例中访
  • 浮点数的精度

    Python 中的浮点数的精度是多少 它总是双精度还是特定于实现或平台 例如 CPython 和 PyPy 有何不同 From Python文档 浮点数通常使用以下方式实现C 中的双倍 有关的信息精确和内部代表 程序所在机器的浮点数 运行可
  • 捕获已达到 set_time_limit() - PHP [重复]

    这个问题在这里已经有答案了 可能的重复 如何捕获致命错误 PHP 超出最大执行时间 30 秒 我用过set time limit 60 之前很多次 但是 当超过这个值时 是否还有捕获 目前它只是以同样的旧错误进行轰炸 我想捕获它失败然后用我
  • 如何为特定部分固定配方蛋的版本

    我在构建中添加了一个部分来安装 python ldap 如下所述 http bluedynamics com articles jens python ldap as egg with buildout 然而我的构建失败了 While In
  • Service Fabric 中的应用程序洞察?

    我需要在我正在开发的 Azure Service Fabric 应用程序中添加性能日志记录 我尝试遵循以下指南 该指南看起来非常简单明了 https github com Microsoft azure content blob maste
  • 查询嵌套表

    我正在尝试查询NESTED TABLE using PL SQL 几个消息来源告诉我这是可能的 但我不断收到错误消息 ORA 21700 对象不存在或已标记为删除 我不明白为什么它不让我这样做 我已经确定dados变量中有内容 我输出它 c
  • Java比较字符串与正则表达式 - while循环

    我希望用户输入一个字符串 如果该字符串与我的正则表达式不匹配 那么我希望输出一条消息 并且用户再次输入一个值 问题是 即使字符串与正则表达式匹配 它也会将其视为不匹配 我的正则表达式 这应该等于 Name Name A Z a zA Z s
  • 单击复选框数据动态保存到数据库

    当我选中复选框时 我需要一些 js ajax jquery 脚本将数据动态保存到数据库 此时的复选框或加载到记录旁边 并根据是否选中来更改数据库中的变量 但是在我选择一个将其保存到数据库后 我必须重新加载页面 我可以做其他所有事情 但了解如
  • 如何在 React JSX 中使用“< >”

    如何在 React 中使用 作为文本 我想将它用于我的投资组合 你需要使用HTML 实体 HTML 中的保留字符必须替换为字符实体 Result Description Entity Name Entity Number lt less t
  • Kivy:如何将复选框设置为在启动时选中

    如何将 id 设置为蓝色的复选框的状态设置为在启动时检查 我使用 python 3 6 和 Kivy 1 9 2 dev0 我以为线条blue ObjectProperty True in py and value root blue in
  • jQuery 滑块范围:将范围应用为表行的过滤器

    在我的实习中 我必须为表格创建一个过滤器 该过滤器必须仅显示您给定的值之间的行 我使用 jQuery UIrange slider我有一个普通的 HTML 表格 我无法让它工作 我尝试了很多不同的事情 这是我的代码 function sli
  • 在饼图中显示附加值

    我有这个饼图数据的示例 import javafx application Application import javafx collections FXCollections import javafx collections Obse
  • 表单视觉隐藏字段和所需验证使用

    我有一个带有隐藏字段的 HTML5 Bootstrap 表单 style display none 我通过 jQuery 显示 隐藏 show hide 对于字段验证 我使用属性required 我希望所有隐藏字段均按要求显示 但当其中一些
  • PHP将抄送插入邮件功能[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 邮件 抄送字段 我正在使用以下 php 发送电子邮件 我需要将抄送添加到我的电子邮件中 当我尝试插入标头时 html 消息显示原始 html 处理抄送的最佳方式是什么 Thanks heade
  • TS(2352) 声明具有动态属性的对象和一个具有特定类型的属性

    我需要创建一个对象 该对象将包含一个名为 state 的属性 该属性将具有通用类型 所有其他属性将是具有覆盖上下文的函数 我不确定这是否可能 因此我决定写在这里 我有一个代码 declare interface ContextModule