如何用打字稿表示嵌套数组

Posted

技术标签:

【中文标题】如何用打字稿表示嵌套数组【英文标题】:How to represent nested array with typescript 【发布时间】:2019-04-24 17:04:06 【问题描述】:

假设我有一个字符串数组,例如:

const a = ['foo', ['aa'], [['zzz',['bar']]]];
    
export const acceptsArray = (v: Array<any>) : string => 
   returns flattenDeep(v).join(' ');
;

除了使用Array&lt;any&gt; 之外,我如何表示嵌套的字符串数组?

【问题讨论】:

【参考方案1】:

解决方案

注意仅适用于 Typescript 3.7+ 版本

type A = 'foo' | 'aa' | 'zzz' | 'bar' | A[]

const a:A = ['foo', ['aa'], [['zzz',['bar']]]];

export const acceptsArray = (v: Array<A>) : string => 
   returns flattenDeep(v).join(' ');
;

谢谢

【讨论】:

这有两层深吗?我希望代表任意级别的嵌套 是的,它的深度是任意的。【参考方案2】:

请检查我之前写的这个实用函数。

// NestedArray<T> represents T or Array of T or Array of Array of T .....
// let nestedNumbers: NestedArray<number> = [[[[[1]]]]];
export type NestedArray<T> = Array<T> | Array<NestedArray<T>>;

// Able to flatten deeply nested array
// flattenArray(nestedNumbers) should produce => [1] : Array<number>
export const flattenArray = <T>(arr: NestedArray<T>): Array<T> => 
  if (!Array.isArray(arr)) return arr ? [arr] : [];

  return arr.reduce<Array<T>>((acc: Array<T>, item: NestedArray<T>) => 
    if (Array.isArray(item)) 
      return [...acc, ...flattenArray(item)];
    
    return [...acc, item];
  , []);

【讨论】:

如果它总是一个数组,看起来这样会更准确吗? export type NestedArray&lt;T&gt; = Array&lt;T&gt; | Array&lt;NestedArray&lt;T&gt;&gt;;,因为这里的 T 本身不必是数组。

以上是关于如何用打字稿表示嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有嵌套数组的 JSON 对象映射到打字稿模型中?

打字稿中数组的两种写作有啥区别

使用打字稿界面来表示来自 Firebase 的结构化数据?

带有打字稿的MongoDB聚合

根据我分配给根节点的类型,从根查询接收类型检查错误。 GraphQL,打字稿。表示

打字稿类嵌套json猫