Отфильтруйте null/undefined при копировании собственных перечисляемых свойств. Тип результата безопасно сделать частичным: nullable-поля могут отсутствовать, а сохранённые значения исключают null и undefined.
Удаление из объекта свойств со значениями null и undefined
Отфильтруйте null/undefined при копировании собственных перечисляемых свойств. Тип результата безопасно сделать частичным: nullable-поля могут отсутствовать, а сохранённые значения исключают null и undefined.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте утилитарную функцию, которая принимает объект и возвращает новый объект, в котором отсутствуют свойства, значения которых равны null или undefined.
- В объекте могут находиться свойства любого типа.
- Необходимо оформить типы как для входных, так и для выходных данных.
Пример:
// вход
{
a: 'test',
b: 23,
c: null,
d: undefined
}
// выход
{
a: 'test',
b: 23
}
Ответ
Отфильтруйте null/undefined при копировании собственных перечисляемых свойств. Тип результата безопасно сделать частичным: nullable-поля могут отсутствовать, а сохранённые значения исключают null и undefined.
type Clean<T> = Partial<{ [K in keyof T]: NonNullable<T[K]> }>;
function removeNullish<T extends object>(input: T): Clean<T> {
const result: Record<PropertyKey, unknown> = {};
for (const key of Reflect.ownKeys(input)) {
if (!Object.prototype.propertyIsEnumerable.call(input, key)) continue;
const value = input[key as keyof T];
if (value !== null && value !== undefined) {
Object.defineProperty(result, key, { value, enumerable: true, writable: true, configurable: true });
}
}
return result as Clean<T>;
}
Число 0, false и пустая строка сохраняются. Symbol-ключи поддерживаются; прототип и дескрипторы исходника не копируются. Очистка поверхностная, вложенные объекты остаются по ссылке. Partial намеренно консервативен: он не обещает наличие полей, исчезновение которых зависит от runtime-значения.