基于输入的动态函数返回类型-TypeScript

时间:2019-08-13 02:48:41

标签: typescript typescript-typings typescript-generics

我有以下TypeScript代码。这是一个带有一些specialKey键的深层嵌套对象。

const obj = {
  THIS: {
    IS: {
      MY: {
        OBJECT: {
          DUDE: {
            specialKey: 'foo',
          },

          specialKey: 'bar',
        },
      },
    },
    CANNOT: {
      BE: {
        specialKey: 'baz',
      },
    },
  },
};

我有一个解析此结构的函数,并生成一个对象,该对象将具有specialKey键的键串联在一起。

const result = parseObj(obj);
/*
  result = {
    THIS_IS_MY_OBJECT: true,
    THIS_IS_MY_OBJECT_DUDE: true,
    THIS_CANNOT_BE: true,
  }
*/

以下是参考功能:

const parseObj = (obj: {}): any => {
  const root = {};

  const inner = (obj, prefix = ''): void => {
    Object.keys(obj).forEach(key => {
      if (key === 'specialKey') {
        root[prefix] = true;
      } else if (key === key.toUpperCase()) {
        inner(obj[key], prefix === '' ? key : `${prefix}_${key}`);
      }
    });
  };

  inner(obj);
  return root;
};

因此该代码有效,但是由于它是如此动态,因此我需要使用any作为返回类型,因此result没有Intellisense,因此无法键入result.~~~~并获取上述对象键的代码完成。是否可以创建类型或重新编写函数,所以我不需要使用any

1 个答案:

答案 0 :(得分:0)

我知道无法实现这一目标; TypeScript并不是那么动态。

但是,根据您的示例,值始终为布尔值,因此您可以略微改善返回类型:

interface ObjectSummary {
  [key:string]: boolean
}

const parseObj = (obj: {}): ObjectSummary => {
  const root: ObjectSummary = {};
  // ...