Javascript 为什么我总是遇到打字错误;没有与此调用匹配的重载“;当使用数组concat时?

Javascript 为什么我总是遇到打字错误;没有与此调用匹配的重载“;当使用数组concat时?,javascript,arrays,typescript,Javascript,Arrays,Typescript,我编写了一个函数,用于从数组中获取第一个n项: export const first = <T>(array: T[], n?: number): T[] => { if (n) return array.slice(0, n) return [].concat(array).shift() } 通过查看第二种类型的调用,我尝试将first函数的第一个参数从array:T[]更改为array:(T | ConcatArray)[,但随后它返回错误 Overload 2

我编写了一个函数,用于从数组中获取第一个
n
项:

export const first = <T>(array: T[], n?: number): T[] => {
  if (n) return array.slice(0, n)
  return [].concat(array).shift()
}
通过查看第二种类型的调用,我尝试将
first
函数的第一个参数从
array:T[]
更改为
array:(T | ConcatArray)[
,但随后它返回错误

Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
    Argument of type '(T | ConcatArray<T>)[]' is not assignable to parameter of type 'ConcatArray<never>'
重载2/2'(…项:ConcatArray[]):never[]),出现以下错误。
类型为“(T | ConcatArray)[]”的参数不能分配给类型为“ConcatArray”的参数
我应该怎么做来修复这些错误? 我不熟悉打字脚本,所以如果这是一个愚蠢的问题,请原谅。

,主要回答是:

这是由严格和非严格的组合造成的:false。一般来说,如果strict处于启用状态,则noImplicitAny也处于启用状态;这组特定的设置将暴露一些奇怪的行为。如果两者都启用,则会看到关于[]隐式地为any[]的错误;如果两者都关闭;我们将使用控制流分析,并将数组作为推(1)之后的数字[]

特定的设置组合意味着我们不允许自己使用控制流分析,也不允许数组隐式地包含任何[],因此never[]是唯一允许的选项

如果你不想穿紧身衣的话,我建议你关掉紧身衣

关于如何解决您的问题,您可以使用我编写的两种方法中的任何一种,我建议您使用第二种方法,因为您将考虑函数返回的两个可能值,在第一种方法中,您只需使用类型断言欺骗TS以返回T[],但是当数组没有值时,类型可能是未定义的

const second=(数组:T[],n?:number):(T |未定义)[]>{
if(n)返回array.slice(0,2)
返回[array.shift()]
}
,主要回答是:

这是由严格和非严格的组合造成的:false。一般来说,如果strict处于启用状态,则noImplicitAny也处于启用状态;这组特定的设置将暴露一些奇怪的行为。如果两者都启用,则会看到关于[]隐式地为any[]的错误;如果两者都关闭;我们将使用控制流分析,并将数组作为推(1)之后的数字[]

特定的设置组合意味着我们不允许自己使用控制流分析,也不允许数组隐式地包含任何[],因此never[]是唯一允许的选项

如果你不想穿紧身衣的话,我建议你关掉紧身衣

关于如何解决您的问题,您可以使用我编写的两种方法中的任何一种,我建议您使用第二种方法,因为您将考虑函数返回的两个可能值,在第一种方法中,您只需使用类型断言欺骗TS以返回T[],但是当数组没有值时,类型可能是未定义的

const second=(数组:T[],n?:number):(T |未定义)[]>{
if(n)返回array.slice(0,2)
返回[array.shift()]
}

您能否确保代码在运行时符合您的要求?在我看来,它要么返回两个元素的数组切片,要么返回数组的单个元素或
未定义的
。真奇怪。您提到的问题是因为编译器将
[]
类型推断为
从不[]
而不是
T[]
,并且这一切都从那里开始走下坡路。给编译器一个类似于
([]as T[]).concat(…)
的提示,问题就会消失。理想情况下,您可以在此处编辑代码,以构成中所述的问题,这样唯一存在的问题就是您正在讨论的问题。您能否确保代码在运行时符合您的要求?在我看来,它要么返回两个元素的数组切片,要么返回数组的单个元素或
未定义的
。真奇怪。您提到的问题是因为编译器将
[]
类型推断为
从不[]
而不是
T[]
,并且这一切都从那里开始走下坡路。给编译器一个类似于
([]as T[]).concat(…)
的提示,问题就会消失。理想情况下,您可以在此处编辑代码,以构成中所述的,这样唯一存在的问题就是您正在讨论的问题。谢谢,我将使用第二个问题,因为返回的可能类型一目了然。@Makyen没有任何链接来自我的个人博客。第一个链接是Typescript存储库中的github问题,我认为当Typescript项目关闭时,它将处于脱机状态,关于链接中的数据,所有问题都很重要,因为问题本身的描述包含更多信息和案例,可以帮助OP更好地理解TS(他在TS中是新的),我将添加最重要的回应报价。关于第二个链接,这是到typescript游乐场的链接,但如果链接断开,我会发布我推荐的方法。@OscarVelandia感谢您更新您的答案。看起来可疑的链接是第二个,因为有一个很长的机器生成的标识符。很好(),你指出是你写的,我真的很感激你这么说。谢谢,我会使用第二个,因为返回的可能类型一目了然。@Makyen没有任何链接来自我的个人博客。第一个链接是Typescript存储库中的github问题,我认为当Typescript项目关闭时,它将处于脱机状态,关于链接中的数据,所有问题都很重要,因为问题本身的描述包含更多信息和案例,可以帮助OP更好地理解TS(他在TS中是新的),我将添加最重要的回应报价。关于第二个链接,这是到typescript游乐场的链接,但如果链接断开,我会发布我推荐的方法。@OscarVelandia感谢您更新您的答案。考虑到有一个很长的机器生成的ide,看起来可疑的链接是第二个
concat(...items: ConcatArray<T>[]): T[];
concat(...items: (T | ConcatArray<T>)[]): T[];
Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
    Argument of type '(T | ConcatArray<T>)[]' is not assignable to parameter of type 'ConcatArray<never>'