无法调用类型缺少调用签名的表达式

2024-03-01

我有苹果和梨——两者都有isDecayed属性:

interface Apple {
    color: string;
    isDecayed: boolean;
}

interface Pear {
    weight: number;
    isDecayed: boolean;
}

这两种类型都可以在我的水果篮中(多次):

interface FruitBasket {
   apples: Apple[];
   pears: Pear[];
}

现在假设我的篮子是空的:

const fruitBasket: FruitBasket = { apples: [], pears: [] };

现在我们从篮子里随机取出一种:

const key: keyof FruitBasket = Math.random() > 0.5 ? 'apples': 'pears'; 
const fruits = fruitBasket[key];

当然,没有人喜欢腐烂的水果,所以我们只挑选新鲜的:

const freshFruits = fruits.filter((fruit) => !fruit.isDecayed);

不幸的是 Typescript 告诉我:

无法调用类型缺少调用签名的表达式。类型 '((callbackfn: (值: Apple, 索引: 数字, 数组: Apple[]) => 任何, thisArg?: 任何) => Apple[]) | ...' 没有兼容的呼叫签名。

这里出了什么问题 - 仅仅是 Typescript 不喜欢新鲜水果还是这是 Typescript 的错误?

你可以自己去官方试试打字稿复制 https://www.typescriptlang.org/play/#src=interface%20Apple%20%7B%0D%0A%20%20%20%20color%3A%20string%3B%0D%0A%20%20%20%20isDecayed%3A%20boolean%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20Pear%20%7B%0D%0A%20%20%20%20weight%3A%20number%3B%0D%0A%20%20%20%20isDecayed%3A%20boolean%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20FruitBasket%20%7B%0D%0A%20%20%20%20apples%3A%20Apple%5B%5D%3B%0D%0A%20%20%20%20pears%3A%20Pear%5B%5D%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Aconst%20fruitBasket%3A%20FruitBasket%20%3D%20%7B%20apples%3A%20%5B%5D%2C%20pears%3A%20%5B%5D%20%7D%3B%0D%0Aconst%20key%3A%20keyof%20FruitBasket%20%3D%20Math.random()%20%3E%200.5%20%3F%20'apples'%3A%20'pears'%3B%20%0D%0Aconst%20fruits%20%3D%20fruitBasket%5Bkey%5D%3B%0D%0A%0D%0Aconst%20freshFruits%20%3D%20fruits.filter((fruit)%20%3D%3E%20!fruit.isDecayed)%3B.


TypeScript 支持结构类型(也称为鸭子类型),这意味着当类型共享相同的成员时,它们是兼容的 https://www.typescriptlang.org/docs/handbook/type-compatibility.html。你的问题是Apple and Pear不要共享其所有成员,这意味着它们不兼容。然而,它们与另一种类型兼容,该类型仅具有isDecayed: boolean成员。由于结构类型,您不需要继承Apple and Pear从这样的界面。

有多种方法可以分配此类兼容类型:

在变量声明期间指定类型

该语句被隐式键入Apple[] | Pear[]:

const fruits = fruitBasket[key];

您可以简单地在变量声明中显式使用兼容类型:

const fruits: { isDecayed: boolean }[] = fruitBasket[key];

为了获得额外的可重用性,您还可以首先定义类型,然后在声明中使用它(请注意,Apple and Pear接口不需要改变):

type Fruit = { isDecayed: boolean };
const fruits: Fruit[] = fruitBasket[key];

转换为操作的兼容类型

给定解决方案的问题在于它改变了fruits多变的。这可能不是您想要的。为了避免这种情况,您可以在操作之前将数组缩小到兼容的类型,然后将类型设置回与fruits:

const fruits: fruitBasket[key];
const freshFruits = (fruits as { isDecayed: boolean }[]).filter(fruit => !fruit.isDecayed) as typeof fruits;

或者使用可重复使用的Fruit type:

type Fruit = { isDecayed: boolean };
const fruits: fruitBasket[key];
const freshFruits = (fruits as Fruit[]).filter(fruit => !fruit.isDecayed) as typeof fruits;

该解决方案的优点是,fruits and freshFruits将是类型Apple[] | Pear[].

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

无法调用类型缺少调用签名的表达式 的相关文章

  • 在 MongoDB 中查找具有字符串 ID 数组的文档

    我有一个 id 字符串数组 我想将其与 find 函数一起使用 db companies find id in arr arr看起来像这样 563a2c60b511b7ff2c61e938 563a2c60b511b7ff2c61e8b7
  • 如何向 jQuery Tokeninput 添加占位符?

    如何将占位符添加到 jQuery Tokeninput 字段 一个正常的placeholder属性在这里不起作用 对于这样的输入
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • Flask wtf.quick_form 运行一些 javascript 并设置表单变量

    我正在创建博客文章 到目前为止已经使用普通的 html 表单完成了 我所做的一个有趣的想法是运行 javascript onclick 并使用页面中的额外数据在表单中设置一个隐藏变量 这很好地传递到服务器并通过 request form 获
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

    我主要了解 Ember JS 的基础知识 大多数示例实际上只处理单个控制器和模型以在页面上显示某些内容 我真的很想用 Ember 构建一个完整的 Web 应用程序 所以有人能告诉我如何组织和连接多个控制器 模型和视图到一个页面中吗 例如 如
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • 如何改变HTML5视频的播放速度?

    如何更改 HTML5 中的视频播放速度 我查过视频标签的属性 https www w3schools com html html5 video asp在 w3school 但无法做到这一点 根据这个网站 http www chipwreck
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 装饰器可以更改方法的签名吗?

    考虑一个函数 function handleFoo foo number 我想要一个解析 foo 的装饰器 例如 fetchFromApi foo function handleFoo foo number where fetchFromA
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 在javascript中动态生成行?

    我是 javascript 新手 我想在按下 Tab 时动态生成行 并希望获取在动态生成的行中输入的值 以便我可以在 servlet 代码中使用这些值 这是我的html
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简
  • 我可以使用 jQuery 动态创建文件(及其内容)吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这是我的 HTML 代码 ul li

随机推荐

  • Chrome 扩展程序中 Facebook.com 上的 POST 请求失败

    我有一个 Chrome 扩展程序 可以在每个页面上发送包含一些数据的 AJAX POST 问题是 Facebook 阻止了 AJAX 请求 导致 拒绝连接到 URL HERE 因为它 违反以下内容安全策略指令 connect src htt
  • python pandas 将数据帧转换为具有多个值的字典

    我有一个包含 2 列地址和 ID 的数据框 我想在字典中合并具有相同地址的 ID import pandas as pd numpy as np df pd DataFrame Address 12 A 66 C 10 B 10 B 12
  • ClojureScript clojure.set?

    如何在 ClojureScript 中使用 clojure set 我总是收到错误 def middle land set for x water hor y vec clojure set difference set range 0 b
  • 带有片段的空白活动不在 Android Studio 中

    您好 我的问题是 当我想在 Android studio 中创建一个新项目并且我想选择带有片段的空白活动时 不是将活动添加到移动窗口 有什么解决方案可以帮助我修复它吗 进入下一页后即可找到它 只需选中 使用片段 框 然后单击 完成
  • Bootstrap Affix 更改列表项宽度

    我正在使用 Twitter Bootstrap 的后缀来附加当前包含导航列表的左栏 div class row div class span3 ul class nav nav list li class nav header Naviga
  • 专门为代表 Now 的 DateTime 制作一个包装器是个好主意吗?

    我最近注意到 为了模拟和测试目的 使用代表 现在 的 DateTime 作为方法的输入参数确实很好 而不是每个方法都调用DateTime UtcNow他们自己 我在上面的方法中执行一次 然后将其转发到下面的方法中 所以很多需要 现在 的方法
  • 我通过 Axios 来自 API 并使用 Vue 显示的数据未显示

    我刚刚开始学习 Vue Js 我试图从 API 中获取一些信息并将其显示在表格中 我真的看不出问题出在哪里 我彻底浏览了代码 但无法弄清楚问题出在哪里 下面是我写的代码 我很漂亮 这是一件小事 或者在当前版本的 Vue 中是否有新的方法来做
  • 在Qt中,QEvent意味着失去窗口焦点,重新获得窗口焦点? (设置透明度)

    当我的应用程序失去焦点时 我需要设置透明度 我还需要在重新获得焦点时重置透明度 通过鼠标单击或 alt tab 或其他方式 我知道如何设置透明度 所以这不是问题 设置窗口不透明度 0 75 问题是何时 我同意 K vin Renella 的
  • 从 SecureRandom 获取确定性值?

    出于基准测试的目的 我希望 SecureRandom 产生确定性的输出 这是否可以通过使用种子 或者算法的规范 来实现 import java security SecureRandom class TestSecureRandom pub
  • 在 Vite 中禁用预加载

    我正在将一个使用 Vue 2 和 Webpack 的大项目迁移到 Vue 3 和 Vite 到目前为止 一切看起来都很棒 但是当我们第一次尝试发布到生产环境时 我们注意到注入了许多模块预加载标签 并且其中的许多文件可能永远不会被使用 问题是
  • python lxml 与 py2exe

    我已经用 dom 生成了一个 XML 我想使用 lxml 来漂亮地打印 xml 这是我用于漂亮打印 xml 的代码 def prettify xml xml str import lxml etree as etree root etree
  • 使用 data.table 将 R 中的许多列乘以特定的其他列?

    我在 R 中有一个很大的 data table 其中有几个带有美元值的列 在另一列中 我有一个通货膨胀调整数字 我试图弄清楚如何用它乘以通货膨胀调整栏来更新我的每个货币栏 假设我有数据 DT lt data table id 1 1000
  • Playframework 2.1 找不到 javax.persistence 和 play.db

    我在使用 Play 框架 版本 2 1 创建实体的 Scala 教程中遇到问题 我正在尝试做 import java util import javax persistence import play db jpa 但是当我编译时 它告诉我
  • 更改 moreNavigationController 图标的颜色

    我已经成功地使用更改了导航栏色调 背景颜色和标签颜色this https stackoverflow com questions 438381 customizing the more menu on a tab bar 但是可以改变图标的
  • 检测 UITableView 部分标题何时捕捉到屏幕顶部

    我想检测何时UITableView节标题捕捉到屏幕顶部 然后修改标题的高度 但我不知道该怎么做 有人可以帮忙吗 我能够通过使用来完成检测哪个标题粘在表视图的顶部didEndDisplayingHeaderView and willDispl
  • 在jHtmlArea中添加表格

    有人知道使 jHtmlArea 支持表格内容并允许用户将表格 单元格 行添加到编辑器框的方法吗 它似乎不是该插件的标准功能 我希望我的用户能够在所见即所得编辑器中创建表 试试这个代码 只需将 editor 更改为您为文本区域设置的 id 即
  • 根据 OnKeyUp 中的文本框过滤列表框项目?

    我有一个包含大量项目的列表框 这些项目都是帐号 因此很难搜索 当用户在文本框中键入内容时 是否可以对项目进行 过滤 以便仅显示与迄今为止输入的内容相匹配的项目 e g List Box 2342 3434 2332 3224 然后用户在文本
  • R - ggplot2 直方图的阴影部分

    所以我有这个数据 dataset rbinom 1000 16 0 5 mean mean dataset sd sd dataset data subset subset dataset dataset gt mean 2 sd data
  • 错误:环境中未设置 XDG_RUNTIME_DIR。 Gtk-警告 **:无法打开显示:

    我曾经用 sublime 打开文本文件 对于只读文件 我曾经这样做 sudo sublime 但现在突然间sudo sublime命令给出以下错误 sublime 3931 Gtk WARNING cannot open display w
  • 无法调用类型缺少调用签名的表达式

    我有苹果和梨 两者都有isDecayed属性 interface Apple color string isDecayed boolean interface Pear weight number isDecayed boolean 这两种