Лучший способ динамически установить атрибут интерфейса - PullRequest
1 голос
/ 24 апреля 2020

Учитывая этот интерфейс:

interface Data {
  name: string;
  route0?: string;
  route1?: string;
  route2?: string;
  route3?: string;
  route4?: string;
  route5?: string;
  route6?: string;
  route7?: string;
  route8?: string;
  route9?: string;
}

Я хочу иметь возможность динамически создавать объекты этого типа из набора входных данных. Это была моя попытка:

interface Route {
   ordinal: number;
   value: string;
}

const createData = (name: string, routes: Route[]): Data => {
   const data: Data = { name };

   routes.forEach(route => {
      // tslint:disable-next-line: no-any
      (data as any)[`route${route.ordinal}`] = route.value;
   });

   return data;
};

console.log(createData('dummy', [{ ordinal: 2, value: 'two' }, { ordinal: 7, value: 'seven' }]));

, которая производит такой вывод:

{ name: 'dummy', route2: 'two', route7: 'seven' }

Что мне не нравится в моем решении, так это то, что мне пришлось разыграть data на любой и затем скажите tslint игнорировать этот каст.

Есть ли лучший способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...