Переписываю свой небольшой проект, попутно учу 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);
};