Автоматически генерировать / получать простые типы на основе поведения функции в TypeScript - PullRequest
0 голосов
/ 28 апреля 2018

Учитывая объект, такой как:

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 голосов
/ 28 апреля 2018

Вы можете попробовать это:

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