Typescript 展平函数的类型脚本类型定义

Typescript 展平函数的类型脚本类型定义,typescript,types,typescript-typings,Typescript,Types,Typescript Typings,我有简单的展平功能。其思想是,它可以获取字符串数组或字符串数组,并且始终只返回1级字符串数组。例如: flatten(['a', ['b']]) // returns ['a', 'b'] flatten(['a', 'b']) // returns ['a', 'b'] 下面是这个函数的实现 function flatten(arr: ReadonlyArray<string | string[]>): string[] { return [].concat(...arr)

我有简单的
展平
功能。其思想是,它可以获取字符串数组或字符串数组,并且始终只返回1级字符串数组。例如:

flatten(['a', ['b']]) // returns ['a', 'b']
flatten(['a', 'b']) // returns ['a', 'b']
下面是这个函数的实现

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return [].concat(...arr);
}
函数展平(arr:ReadonlyArray):字符串[]{
返回[]concat(…arr);
}
我收到以下TypeScript编译器错误:

  error TS2769: No overload matches this call.
    Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.
    Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.

  105   return [].concat(...arr);
                        ~~~~~~
错误TS2769:没有与此调用匹配的重载。
重载2中的第1个“(…项:ConcatArray[]):never[]”,出现以下错误。
“string | string[]”类型的参数不能分配给“ConcatArray”类型的参数。
类型“string”不可分配给类型“ConcatArray”。
重载2,共2个“(…项:ConcatArray[]):never[]”,出现以下错误。
“string | string[]”类型的参数不能分配给“ConcatArray”类型的参数。
类型“string”不可分配给类型“ConcatArray”。
105返回[].concat(…arr);
~~~~~~

如何定义此
展平
函数的输入和输出类型?我想避免使用
任何
类型。

我认为编译器无法确定
[]
值应该是什么数组类型。这里最简单的解决方法是告诉它是一个
字符串[]
,带有:

函数展平(arr:ReadonlyArray):字符串[]{
返回([]作为字符串[])。concat(…arr);
}
希望有帮助;祝你好运


我认为编译器无法确定
[]
值应该是什么数组类型。这里最简单的解决方法是告诉它是一个
字符串[]
,带有:

函数展平(arr:ReadonlyArray):字符串[]{
返回([]作为字符串[])。concat(…arr);
}
希望有帮助;祝你好运


必须指定返回值的类型,在本例中是字符串数组

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
    const output: string[] = [];
    return output.concat(...arr);
}
函数展平(arr:ReadonlyArray):字符串[]{
常量输出:字符串[]=[];
返回输出concat(…arr);
}

必须指定返回值的类型,在本例中是字符串数组

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
    const output: string[] = [];
    return output.concat(...arr);
}
函数展平(arr:ReadonlyArray):字符串[]{
常量输出:字符串[]=[];
返回输出concat(…arr);
}

如果有人在寻找任意深度和任意类型的扁平阵列,这里有一个解决方案:

type ExtractLeafTypes<T> = T extends ReadonlyArray<infer U> ? ExtractLeafTypes<U> : T
function deepFlatten<T extends ReadonlyArray<any>>(arr: T): Array<ExtractLeafTypes<T>> {
    return arr.reduce((acc, n) => acc.concat(Array.isArray(n) ? deepFlatten(n) : [n]) , [])
}

const numbers = [1, [2], [[3]], [[[[4]]]]]
const flatNumbers = deepFlatten(numbers) // : number[]
const mixed = [1, ['a', ['b'], [[[[[[['c']]]]]]]], [2, [3, [[[[[[[[[[4]]]]]]]]]]]]]
const flatMixed = deepFlatten(mixed) // : (number | string)[]
const strict = [1, ['a', ['b'], [[[[[[['c']]]]]]]], [2, [3, [[[[[[[[[[4]]]]]]]]]]]]] as const
const flatStrict = deepFlatten(strict) // :  (1 | "a" | "b" | "c" | 3 | 2 | 4)[]
type ExtractLeafTypes=T扩展只读数组?类型:T

函数deepflatte如果有人正在寻找任意深度和任意类型的平坦阵列,这里有一个解决方案:

type ExtractLeafTypes<T> = T extends ReadonlyArray<infer U> ? ExtractLeafTypes<U> : T
function deepFlatten<T extends ReadonlyArray<any>>(arr: T): Array<ExtractLeafTypes<T>> {
    return arr.reduce((acc, n) => acc.concat(Array.isArray(n) ? deepFlatten(n) : [n]) , [])
}

const numbers = [1, [2], [[3]], [[[[4]]]]]
const flatNumbers = deepFlatten(numbers) // : number[]
const mixed = [1, ['a', ['b'], [[[[[[['c']]]]]]]], [2, [3, [[[[[[[[[[4]]]]]]]]]]]]]
const flatMixed = deepFlatten(mixed) // : (number | string)[]
const strict = [1, ['a', ['b'], [[[[[[['c']]]]]]]], [2, [3, [[[[[[[[[[4]]]]]]]]]]]]] as const
const flatStrict = deepFlatten(strict) // :  (1 | "a" | "b" | "c" | 3 | 2 | 4)[]
type ExtractLeafTypes=T扩展只读数组?类型:T
函数深度展平