如何键入接收动态参数并进行递归的函数

时间:2018-03-21 14:26:24

标签: typescript typescript-typings

我遇到了麻烦,弄清楚如何输入这个实用程序函数,它可以接收任何形式的Object / Array / Number / String中的某些数据。

然后它调用它的各自处理程序,如parseArray,它接收一个数组,然后在数组的每个项目上调用parseData

因此,这个函数几乎可以在任何结构中获取一些数据,并返回相同的结构并对其进行一些解析。

会喜欢这方面的指导。

function parseData(data) {
  if (Array.isArray(data)) {
    return parseArray(data);
  }

  if (typeof data === 'object') {
    return parseObject(data);
  }

  if (typeof data === 'string') {
    return parseString(data);
  }

  return data;
}

2 个答案:

答案 0 :(得分:2)

您可以使用泛型函数,并且结果类型和参数类型具有相同的泛型类型参数:

function parseData<T>(data: T): T {
    if (Array.isArray(data)) {
        return parseArray(data);
    }

    if (typeof data === 'object') {
        return parseObject(data);
    }

    if (typeof data === 'string') {
        return parseString(data);
    }

    return data;
}

由于parse*函数将采用不同的参数类型,您可能需要通过any返回T

function parseData<T>(data: T): T {
    if (Array.isArray(data)) {
        return parseArray(data as any) as any; 
    }

    if (typeof data === 'string') {
        return parseString(data as string) as any;
    }

    if (typeof data === 'object') {
        return parseObject(data);
    }

    return data;
}

function parseObject (data: any) : any {
    return data;
}
function parseArray<T>(data: T[]) : T[] {
    return data;
}
function parseString (data: string) : string {
    return data;
}

答案 1 :(得分:2)

  

如何键入接收动态参数并进行递归的函数

它与JSON.parse的类型基本相同。

您可以使用泛型类型参数:

function parseData<T>(data)<T> {
}