当前位置: 首页 > 面试题库 >

打字稿-…没有兼容的呼叫签名

车峻熙
2023-03-14
问题内容

我收到了不兼容的呼叫签名错误,并且不知道该怎么做才能使其正常工作。

反应态

     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开始,如果功能的联盟至多有一个元素是通用或超载。在您的情况下,由于categoryis 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()方法公开所有正在进行的调用。您可以编写代码,以按标签,主机或其他方式选择调用,然后在不