@null_object

Как получить значение объекта/массива по строковому ключу?

Переписываю свой небольшой проект, попутно учу TS.

Есть такая функция
const deep_value = (obj, path) => {
  return path.split('.').reduce((p, c) => p?.[c], obj);
};


Вот как она работает
const obj = {
  a: 'a1',
  b: {
    b1: 'b1',
    b2: { bb1: 'bb1' },
  },
  c: ['arr1', 'arr2', { c1: 'c1' }],
};

describe('Objects helper', () => {
  test('Simple object values', () => {
    expect(deep_value(obj, 'a')).toBe('a1');
    expect(deep_value(obj, 'b')).toMatchObject({
      b1: 'b1',
      b2: { bb1: 'bb1' },
    });
    expect(deep_value(obj, 'c')).toMatchObject(['arr1', 'arr2', { c1: 'c1' }]);
  });

  test('Nested objects', () => {
    expect(deep_value(obj, 'b.b1')).toBe('b1');
    expect(deep_value(obj, 'b.b2.bb1')).toBe('bb1');
  });

  test('Nested arrays', () => {
    expect(deep_value(obj, 'c.0')).toBe('arr1');
    expect(deep_value(obj, 'c.1')).toBe('arr2');
    expect(deep_value(obj, 'c.2.c1')).toBe('c1');
  });

  test('Non-existent path', () => {
    expect(deep_value(obj, 'd')).toBeUndefined();
  });
});


Как её можно переписать на TS? У меня были некоторые попытки, но я так и не разобрался.
const deep_value = <T extends object | [], K extends keyof T[keyof T]>(
  obj: T,
  path: string
): T[K] => {
  return path.split('.').reduce((p, c) => p?.[c], obj);
};
  • Вопрос задан
  • 212 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы