Ключ объекта на основе значений массива

#javascript #typescript

#javascript #typescript

Вопрос:

У меня есть массив: const arr = ['foo', 'bar', 'bax'];

Я хочу создать объект на основе записей массива:

 const obj = {
  foo: true,
  bar: true,
  bax: false,
  fax: true, // typescript should show error here because "fax" is not in "arr"
};
 

Как сообщить typescript, что все ключи obj должны быть внутри arr ?

Ответ №1:

Вы можете сделать так:

 const arr = ['foo', 'bar', 'bax'] as const;

type MappedObject = Record<typeof arr[number], boolean>;

const obj: MappedObject = {
  foo: true,
  bar: true,
  bax: false,
  fax: true, // typescript should show error here because "fax" is not in "arr"
};
 

Игровая площадка TypeScript

Связанная проблема с GitHub — Microsoft / TypeScript #28046

Комментарии:

1. Связанная проблема с GitHub Microsoft / TypeScript #28046

Ответ №2:

 const arr = ['foo', 'bar', 'bax'];

//I want to create an object based on array entries:

const obj = {
  foo: true,
  bar: true,
  bax: false,
  fax: true, // typescript should show error here because "fax" is not in "arr"
};

for(const [key, value] of Object.entries(obj))
{
  if(!arr.includes(key))
  {
    console.log(`error, ${key}: ${value} not found in array`)
  }
} 

Комментарии:

1. Спасибо, но я попросил решение на typescript, а не javsscript

2. @underfrankenwood Typescript — это подмножество javascript, поэтому технически это решение typescript.

3. Подмножество? Я думаю, вы имеете в виду супер набор. В любом случае это не то, чего я ожидал. Извините