【问题标题】:Dynamic function return type based on input - TypeScript基于输入的动态函数返回类型 - TypeScript
【发布时间】:2019-12-19 14:00:45
【问题描述】:

我有以下 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没有智能感知,所以我不能输入result.~~~~并获得代码完成上面的对象键。是否可以创建一个类型或重新编写函数,这样我就不需要使用any

【问题讨论】:

    标签: typescript typescript-typings typescript-generics


    【解决方案1】:

    据我所知,没有办法实现这一点; TypeScript 不是那么动态的。

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

    interface ObjectSummary {
      [key:string]: boolean
    }
    
    const parseObj = (obj: {}): ObjectSummary => {
      const root: ObjectSummary = {};
      // ...
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多