我收到了不兼容的呼叫签名错误,并且不知道该怎么做才能使其正常工作。
反应态
this.state = {
categoryState: ...,
categoryItemId
}
类别声明
let category: Cat1[] | Cat2[] | Cat3[] = this.getCategory();
getMethod返回类别
private getCategory() {
switch (this.state.categoryState) {
case "Cat1": {
return this.props.cat1 as Cat1[];
}
case "EVENT": {
return this.props.cat2 as Cat2[];
}
default: {
return this.props.cat3 as Cat3[];
}
}
}
return-Method(反应),这是发生错误的地方:
<select value={this.state.categoryItemID} onChange={this.handleSomething}>
{(category && category.length > 0) &&
category.map((item: any) => {
return (
<option value={item.id}
key={item.id}>{item.localizations[this.props.currentLanguage].title}</option>
);
})
}
</select>
错误html" target="_blank">消息:TS2349:无法调用其类型缺少呼叫签名的表达式。类型’(((callbackfn:(值:Cat1,索引:数字,数组:Cat1 [])=>
U,thisArg ?: any)=> U [] | …’没有兼容的呼叫签名。
更新2019-03:随着TypeScript
3.3的发布,调用函数类型的并集已经取得了进展,但不幸的是,对于通用方法来说,这种痛点仍然存在Array.prototype.map()
:
这是一个痛点在打字稿:有没有办法来调用,除非“的功能类型union”
要么
他们接受完全相同的参数,或者在TS3.3开始,如果功能的联盟至多有一个元素是通用或超载。在您的情况下,由于category
is Cat1[] | Cat2[] | Cat3[]
,所以方法category.map()
本身就是通用函数的并集,这些通用函数的参数不相同;而且你不能打电话。category.map(f)
如果f
是可以接受的函数,则应该安全地调用Cat1 | Cat2 | Cat3
(这似乎很明显,但是涉及到理解方法参数的矛盾,这很容易混淆)。但是,作为链接的问题提到,编译器不会让你这样做:
目前,这是设计使然,因为在获取联合类型的成员时我们不合成交叉调用签名-只有 相同的 调用签名才会出现在联合类型上。
所以你得到一个错误。幸运的是,有解决方法。在您的情况下,最简单的方法category
不是将视为Cat1[] | Cat2[] | Cat3[]
,而是将视为(Cat1 | Cat2 | Cat3)[]
。只要您只是从数组中读取而不是写入数组,这样做就应该是安全的:
let category: Cat1[] | Cat2[] | Cat3[] = this.getCategory();
const mappableCategory = category as (Cat1 | Cat2 | Cat3)[];
现在您应该可以映射,mappableCategory
而不是category
:
mappableCategory.map((item: any) => { /* ... */ }); // should work now.
(只需重申一下:读mappableCategory
是可以的,但是写mappableCategory
可能是一个错误,因为Cat1
即使基础category
是数组,它也会很乐意接受的元素Cat2
。因此,除非您确定自己要在做。)
希望对您有帮助。祝好运!
比方说,我们班有一个典型的吸气剂 以及使用它的界面 通过此接口处理实例时,如果我们尝试分配给 fullName,编译器不会警告我们缺少 setter,并且 JS 运行时只是吞下任何赋值并且不会抛出错误。有没有办法将接口成员标记为只有 getter 或只有 setter? 我看过这个帖子,但它很旧了,我想知道,如果有什么改进。
我已经在我的.html文件中定义了这些: 然后在test.js: 但Typescript错误地指出:“找不到名称‘树’” 我也尝试编译与和放置在test.js文件的顶部,但它再次出错:
我正在努力寻找 有什么不同?
我正在学习Typescript,并尝试实现一个简单的React/Redux应用程序。当我使用同步操作时,它工作得很好,但问题在于异步操作。我正在学习官方的redux教程。 首先,我宣布会议状态 然后我为这个动作声明接口 我使用联合类型导出它们
我尝试将Content-Type的头修改为multipart/form-data和application/octet-stream。我还尝试取消postman中的headers部分,并在选择文件时依赖于表单数据和二进制设置的正文类型。“表单-数据”设置会将以下内容添加到调用中: 内容-处置:表单-数据;name=“TheFileTosend.txt”;filename=“TheFileTosend
问题内容: 我最近升级到OkHttp3,并注意到您不能再直接从客户端取消按标签呼叫。现在必须由应用程序处理。 在CHANGELOG中表示: 现在,取消批量呼叫是应用程序的责任。 删除了通过标签取消调用的API,并已将其替换为更通用的机制。调度程序现在通过其runningCalls()和queueedCalls()方法公开所有正在进行的调用。您可以编写代码,以按标签,主机或其他方式选择调用,然后在不