Возвращает список значений соответствующего ключа из другого объекта. (Пересечение двух объектов)

#javascript #typescript

#javascript #typescript

Вопрос:

 const validValuesByDataType: any = {
    [DataTypes.STRING]: [
        ValueType.CALL,
        ValueType.PUT,
    ],
    ...
}

const values: any = {
    [ ValueType.CALL ]: {value: 'call', label: 'CALL'}, 
    [ ValueType.PUT ]: {value: 'put', label: 'PUT'},
    ...
}

  

Я хотел бы получить допустимые значения на основе типа данных. Который ['call', 'put']

 const valueMap = validValuesByDataType[fieldType];
valueMap.map((o: any) => values[o].value); => I got "call" and "put" printing.
  

Как мне получить массив значений значений? Я хотел бы иметь некоторые виды формы чего-то подобного.

 [ ...values.concat[type] ]
  

Если у вас есть какая-либо другая лучшая структура, любая помощь будет высоко оценена.

Кроме того, у меня возникли проблемы с определением типа каждого объекта. Не стесняйтесь добавлять любые комментарии, пожалуйста!

Ответ №1:

Если вы используете достаточно новую версию javascript, то сопоставление значений упрощается с помощью Array.prototype.flatMap.

 function test(fieldType: DataTypes) {
    const valueMap = validValuesByDataType[fieldType];
    valueMap.flatMap(o => values[o].value);
}
  

ValueType и DataType , похоже, это перечисления, которые можно использовать как тип. Тип typescript Record описывает объект, в котором все ключи одного типа, а все значения другого типа. Это то, что мы будем использовать для объектов поиска.

 const validValuesByDataType: Record<DataTypes, ValueType[]>

const values: Record<ValueType, {value: stringlabel: string;}>
  

Ссылка на игровую площадку TypeScript

Перечисления в полном порядке, и проблем нет, но поскольку вы спрашивали о других структурах, альтернативой было бы определить ваши типы значений и типы данных как строковые литералы.

Любой из них имеет тот же эффект:

 const valueTypes = ['CALL', 'PUT'] as const;

type ValueType = typeof valueTypes[number]; // evaluates to "CALL" | "PUT"
  

Ссылка

 type ValueType = "CALL" | "PUT";

const valueTypes: ValueType[] = ['CALL', 'PUT'];
  

Ссылка