“数字”类型的参数不能分配给“数字和字符串”类型的参数

Posted

技术标签:

【中文标题】“数字”类型的参数不能分配给“数字和字符串”类型的参数【英文标题】:Argument of type 'number' is not assignable to parameter of type 'number & string' 【发布时间】:2019-10-16 20:29:44 【问题描述】:

我想在我的 ts 文件中使用 Array.prototype.includes 方法。

const id = this.selectedItem.id;
ids.includes(id);

其中ids 是一个数字数组。 我总是得到一个编译错误: Argument of type 'number' is not assignable to parameter of type 'number & string'

当显式将 id 转换为数字 Number(id) 时,我还会看到 Type number is not assignable to type string。 当我明确地将 id 转换为字符串id.toString() 时,我可以看到Type string is not assignable to type number

这是压倒性的。如何在 TypeScript 中使用 includes 方法?如何在我的示例中使用它?

[编辑] 扩展示例:

    interface State extends EntityState<IItem> 

    this.stateSubscription = this.store.select((state: State) => state.items).subscribe(
        val => 
            const selectedId = this.selectedItem ? this.selectedItem.id : null;
            val.ids.includes(selectedId);
    ));

val.ids.includes(selectedId as any) 也不起作用。

【问题讨论】:

【参考方案1】:

您已将ids 声明为number[] &amp; string[]

这意味着您提供给方法的参数应该是number[] &amp; string[] 类型。

尝试将其声明为number[] | string[],这是其中之一,而不是两者。

【讨论】:

可能你有权利,但是这个接口是ngrx/entity预定义的东西。我试过const ids: string[] | number[] = val.ids;,但没有结果。 试过 ids.includes(selectedId as any) 但是:Cannot invoke an expression whose type lacks a call signature. Type '((searchElement: string, fromIndex?: number) =&gt; boolean) | ((searchElement: number, fromIndex?: number) =&gt; boolean)' has no compatible call signatures. @krzyhub 你能提供一个minimal reproducible example你的问题吗? @krzyhub 我不是在谈论扩展示例,而是在谈论您在stackblitz.com 上制作的minimal reproducible example:没有您工作的上下文(库、效果等) ,除了这些,我真的无能为力了 我觉得这个案子不值得。我会尝试Array.prototype.includes 以外的其他方法,因为 TS 实在是太烂了。感谢您的努力。

以上是关于“数字”类型的参数不能分配给“数字和字符串”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

获取错误“未知”类型的参数不能分配给“错误”类型的参数 |空值'

参数类型“字符串”不能分配给参数类型“目录”

颤振列表错误参数类型'List'不能分配给参数类型'String'

参数类型“对象?”不能分配给参数类型'String'最新版本

TypeScript - 'String' 类型的参数不能分配给'string' 类型的参数

参数类型“Type”不能分配给参数类型“FirebaseUser”