【问题标题】:Return type of array concat数组 concat 的返回类型
【发布时间】:2021-05-07 17:41:03
【问题描述】:

我有一个方法可以从嵌套对象中创建一个扁平对象数组。

{a: 'b',
 c: {d: 'e'}
}

将会

[{a: 'b'}, {d:'e'}]

所以这个方法的返回类型是一个对象数组(Record<string, any>[])。但是 Typescript 给出了以下错误:

TS2769:没有与此调用匹配的重载。 ... 'Record[] 类型的参数 | { [x:字符串]:任何; }' 不可分配给“ConcatArray”类型的参数。类型 'Record[]' 不可分配给类型 'ConcatArray'。

_flatten 方法的正确返回类型是什么:

const _flatten = (obj: Record<string, any>): Record<string, any>[] =>  
    [].concat(...Object.keys(obj)
             .map((key: string) => (
                   typeof obj[key] === 'object' ? _flatten(obj[key]) : { [key]: obj[key] }
             ))
         );

【问题讨论】:

  • 主要问题是您正在映射 - 这意味着结果是单个对象或对象数组。你可以使用flatMap 来解决这个问题,你也不需要做[].concat(... /*mapping*/)

标签: typescript


【解决方案1】:

我猜错误信息是这样的:

Type 'Record<string, any>[]' is not assignable to type 'ConcatArray<never>'

那是因为你使用了[].concat[]never[] 的类型。

尝试改用Array.prototype.concat

const _flatten = (obj: Record<string, any>): Record<string, any>[] =>  
    Array.prototype.concat(...Object.keys(obj)
             .map((key: string) => (
                   typeof obj[key] === 'object' ? _flatten(obj[key]) : { [key]: obj[key] }
             ))
         );

Typescript sandbox

或者你可以像这样输入[]

([] as any[]).concat(/* omitted */)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2015-09-13
    • 2014-08-23
    • 2012-12-21
    • 1970-01-01
    相关资源
    最近更新 更多