根据TypeScript中的函数行为自动生成/获取简单类型

时间:2018-04-28 04:57:59

标签: javascript typescript types definitelytyped

给出如下对象:

const foo = {
   a: {id: 1},
   b: {id: 1},
   c: {id: 1},
   d: {id: 1},
   ....
}

以及将对象转换为:

的函数
const bar = {
   a: 1,
   b: 1,
   c: 1,
   d: 1,
   ....
}

如:

function<MyInputInterface>(map: MyInputInterface): MyOutputInterface? {
  const newMap = {};
  _.forIn(map, (val, key) => {
      newMap[key] = val.id;
  }
  return newMap;
}

有没有办法在Typescript中只定义一个自动承担另一个(输入或输出)结构的接口? 例如。将MyInputInterface传递给函数将返回MyOutputInterface

一般来说,由于某些库提取元信息并仅返回某些值(例如id),我所描述的模式在我的代码库中的许多地方都可以找到。我当然可以将输入/输出定义为接口来获取更多的类型信息,但我有兴趣看看是否有一个解决方案,只需要定义输入或输出,并免费获得其他类型信息。

由于这个例子可能不够清楚,这里有一个更好的例子:

const properties = {
   propA: {
      desc: 'property a',
      val: 1
   },
   propB: {
      desc: 'property b',
      val: 'hello'
   }
   // any arbitrary number of properties
};

需要转换为:

const parsedProperties = {
  propA: 1,
  probB: 'hello'
};

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

private foo:Foo= {
    propA: {
        desc: 'property a',
        val: 1
    },
    propB: {
        desc: 'property b',
        val: 'hello'
    }
};

converter(foo:Foo , probName ):Bar{
    let bar:Bar={};
    for(let a in foo){
        bar[a] = foo[a][probName];
        }
    return bar;
    }
}

interface Foo{
    [propA: string]:{[propB:string]:string|number};
}
interface Bar{
    [name: string]:string|number ;
}

console.log('bar' , this.converter(this.foo , 'val' ));