Typescript преобразует объект в массив с новыми объектами в соответствии с полями

#javascript #typescript

#javascript #typescript

Вопрос:

У меня есть объект с несколькими конкретными полями:

  const obj1: Obj = {  
    hello: true, 
    second: false, 
    third: 311,  
    fifty: 50  
    .....  
}  
  

Мне нужно сопоставить некоторые поля из этого объекта с конкретным числом (и использовать его значение) и вернуть массив с ним:

 interface ArrayItem {
    index: number;
    visible: boolean;
}

// hello should be mapped to 3, and visible - 'true'
// result is:
const arr: ArrayItem[] = [{index: 3, visible: true}]
  

Для конкретного поля. например, если obj1, имеет поле «hello», результатом будет:

 [  
    {
     index: 3  
     visible: (value of 'hello', so -> true)  
    }  
]  
  

Еще примеры:

  const obj1: Obj = {
    hello: true,
    second: false,
    third: 311,
    fifty: 50
    .....
}
  

// поля, которые я ищу:

 const mapped = {
    hello: 3, // index value
    second: 5 // index value
}
  

выходной сигнал:

 [
    {
     index: 3
     visible: (value of 'hello', so -> true)
    }
    {
     index: 5
     visible: (value of 'second', so -> false)
    }
]
  

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

1. Итак, вы хотите выполнить синтаксический анализ Obj в new только с помощью ключей index и visible , не так ли?

2. это правильно. Но зависит от конкретных полей. например, я знаю, что поле «привет» будет преобразовано в 3.

3. Хорошо, а как насчет того, что Obj он должен содержать hello и second поля с логическими значениями? И повлияют ли какие-либо другие ключи на ArrayItem ?

4. да, они логические. У Obj есть какие-либо другие поля, которые мне не нужно обрабатывать. У меня есть карта с конкретными полями, которые мне нужно сопоставить, например, const maps = {hello: 3, second: 4}

Ответ №1:

Давайте объявим определение типа Obj

 type Obj = { [key: string]: boolean };
  

Объект со многими ключами и bool для всех значений.

Элементы массива выглядят следующим образом:

 interface ArrayItem {
    index: number;
    visible: boolean;
}
  

Но мы можем получить больше знаний о типах на основе значений из Obj . Чтобы объявить это, давайте напишем InterfaceParser generic.

 type InterfaceParser<T extends Obj> = {
  index: T['hello'] extends true ? 3 : number;
  visible: boolean;
}
  

T extends Obj означает, что тип ввода должен быть не менее Obj . extends true ? 3 : number означает, что когда ключ hello имеет значение true, тип индекса не number является 3 .

<a rel="noreferrer noopener nofollow" href="https://www.typescriptlang.org/play/index.html#src=type Obj = { [key: string]: boolean };

interface ArrayItem {
index: number;
visible: boolean;
}

type InterfaceParser = {
index: T[‘hello’] extends true ? 3 : number;
visible: boolean;
}

let map = (obj: Obj): InterfaceParser => ({
index: 0,
visible: true,
})» rel=»nofollow noreferrer»>Игровая площадка

({
index: mapped[key],
visible: !!obj1[key],
}))» rel=»nofollow noreferrer»>Игровая площадка 2

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

1. спасибо @Przemyslaw Pietrzak, но, похоже, это не то, что мне нужно. Я обновил основную тему, посмотрите, пожалуйста.

2. Честно говоря, я не понимаю, в чем проблема. Я думал, вы хотите ввести некоторые значения (например, 3 вместо числа при «привет»). Не могли бы вы подробнее рассказать или привести больше примеров?

3. Обновленная тема. Смотрите ниже «Другие примеры:» @Przemyslaw Pietrzak,

4. Я думаю, вы ищете что-то вроде: нажмите Playground2 на ссылку