#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'];