首页 > 解决方案 > 如何键入任意对象或其任何键作为方法参数

问题描述

我一直在尝试键入递归序列化任意对象的输入法。我使用了映射类型、泛型参数、递归类型(如 JSON 类型),但没有任何运气):

这是我试图摆脱any参数中的方法:

export function serialize(data: any) {
  if (data === null) {
    return '';
  }

  if (typeof data === 'object') {
    let serializedData = '';
    for (const k of Object.keys(data).sort()) {
      serializedData += k;
      if (data[k] !== null) {
        serializedData += serialize(data[k]);
      }
    }
    return serializedData;
  }

  return data.toString();
}

标签: typescript

解决方案


您需要一个自定义类型保护来将值细化为Record<string, unknown>.

const isUnknownRecord = (u: unknown): u is Record<string, unknown> =>
  typeof u === 'object' && u !== null

export function serialize(data: unknown): string {
  if (data === null) {
    return ''
  }

  if (isUnknownRecord(data)) {
    let serializedData = ''
    for (const k of Object.keys(data).sort()) {
      serializedData += k
      if (data[k] !== null) {
        serializedData += serialize(data[k])
      }
    }
    return serializedData
  }

  return String(data)
}


推荐阅读