Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据TypeScript中函数的行为自动生成/获取简单类型_Javascript_Typescript_Types_Definitelytyped - Fatal编程技术网

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

Javascript 根据TypeScript中函数的行为自动生成/获取简单类型,javascript,typescript,types,definitelytyped,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): MyOutputInterfa

给定一个对象,例如:

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;
}
需要转换为:

const parsedProperties = {
  propA: 1,
  probB: 'hello'
};
您可以尝试以下方法:

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' ));

嗨,法蒂姆,谢谢你。不幸的是,这并不像我希望的那样通用。我的示例只是简单的最小值,实际环境看起来非常不同(更多的键/值对)。此外,我传入转换器的每个元素可能不同(它们具有不同的结构)。我想从Foo到Bar不用申报两个interfaces@Frame91我更新了答案,我知道它没有你想要的那么一般,但希望这会有所帮助。我认为至少函数应该知道你想要的
probName
。对不起,这仍然不是我想要的,因为它仍然需要我编写两个接口。我在看哪一个可以满足我的需要
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' ));