Есть вот такая задача:
Типизация функции getValue
Необходимо типизировать функцию, реализация которой предоставлена ниже:
const getValue =
(obj, isIncludeKey = false) =>
(key) => {
if (!isIncludeKey) {
return obj[key];
}
return Object.entries(obj).reduce((result, pair) => {
const [pairKey, pairValue] = pair;
if (pairKey.includes(key)) {
return [...result, pairValue];
}
return result;
}, []);
};
Требования:
Key должен быть типизирован, то есть нельзя указать key, который не принадлежит объекту
Возвращаемое значение (одиночное значение или массив) должно на уровне типов конкретизироваться через параметр isIncludeKey (подсказка, необходимо использовать Generic и conditional type)
у меня не получается использовать conditional type, получилось что то похожее с ипользованиеv type guard, но это не совсем то, т.к. при поиске по похожим ключам возвращается never[] а хотелось бы что бы правильный тип
Вот что примерно выходит когда я пробую:
const checkIsIncludeKey = (isIncludeKey: boolean): isIncludeKey is true => {
return isIncludeKey;
};
const getValue =
<T extends Object, V extends boolean = false>(obj: T, isIncludeKey: V) =>
(key: keyof T) => {
if (!checkIsIncludeKey(isIncludeKey)) {
return obj[key];
}
return Object.entries(obj).reduce((result, pair) => {
const [pairKey, pairValue] = pair;
if (pairKey.includes(key as string)) {
return [...result, pairValue];
}
return result;
}, []);
};
const a = getValue({ a: 123, cfd: "123123" }, true)("cf");