gpt4 book ai didi

arrays - Typescript 编译器不允许调用两种数组类型联合的方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:14 25 4
gpt4 key购买 nike

请考虑以下功能:

function getArray(): string[] | number[] {
return [];
}

长话短说,当我这样做时:

getArray().forEach(item => console.log(item));

编译器给我这个:

TS2349 Cannot invoke expression whose type lacks a call signature.

为什么会这样?他们是我的看法,forEach应该可以在这里调用而不会出错,因为对于编译器而言,肯定会返回一个数组。有趣的是,IntelliSense 将像往常一样为此方法提供自动完成功能,但在使用自动完成建议后,错误消息将显示在输出中。

这是一个错误,还是我在这里遗漏了一些微不足道的东西?


编辑:我可以使用各种解决方法,比如返回 Array<string | number>相反,或者使用重载,但我特别感兴趣的是为什么返回两个数组类型的联合不允许方法调用。

可以确定类型是数组,元素类型为string | number .

最佳答案

一般来说,没有一种好的“安全”方式来处理方法具有不同签名的联合类型的方法调用(当这些方法具有相同的签名时,TypeScript 允许方法调用)就好像只有一种方法。

考虑这个例子:

class ValueHaver<T> {
value: T;
update(x: () => T) { this.value = x(); }
}

let x: ValueHaver<number> | ValueHaver<string> = /*...*/;
x.update(() => 42);

此代码不正确。如果x结果是ValueHaver<string> ,那么你就会有一个 number坐在哪里string应该是。

但是这个调用与 forEach 一样有效(假设有一些假设的规则集)调用 Array<number> | Array<string> .

您可能会说“好吧,您可以尝试为联合中的每种可能类型的 X.y 调用方法 X”。理论上这可以工作,但在实践中(尤其是在 TypeScript 2.0 中)您可以轻松获得具有许多成分的联合类型。 知道特定类型是否有效的唯一方法是对整个调用进行类型检查,及其参数(因为上下文类型),从头再来一遍,这会让人望而却步昂贵的。由于技术原因,TS 编译器通常无法做到这一点——一旦给定表达式的类型被解析,它就会被缓存。

关于arrays - Typescript 编译器不允许调用两种数组类型联合的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com