javascript - Typescript'te bir Nesneden null özellikleri kaldırma
Referans olarak, Javascript'te bir Objeden boş özellikler nasıl kaldırılır, bunu Typescript uyumlu nasıl yapabiliriz?
JS fonksiyonu (iç içe nesneler | ES10):
function removeEmpty(obj) {
return Object.fromEntries(
Object.entries(obj)
.filter(([_, v]) => v != null)
.map(([k, v]) => [k, v === Object(v) ? removeEmpty(v) : v])
);
}
Exclude<T, null> ile denedim ama iç içe geçmiş nesnelerle çalışmıyor ve sanırım kullanılması gereken doğru yardımcı araç değil.
Dönülen türün null türünü kaldırması, ancak undefined türünü koruması gerektiğini unutmayın.
Örnek/Beklenen davranış:
type TestType = {
a?: {
b?: {
c: string;
} | null;
z?: {
x: string;
};
} | null;
};
const testObj: TestType = {
a: {
b: null,
z: { x: 'Hi' }
}
};
const resultObj = removeEmpty(testObj);
resultObj türü benzer olduğunda:
type ResultTestTypeExample = {
a?: {
b?: {
c: string;
};
z?: {
x: string;
};
};
};
Cevap #1
Bu senin için uygun mu?
type ExpandRecursively<T> = T extends object
? T extends infer O ? { [K in keyof O]: ExpandRecursively<O[K]> } : never
: T;
type RemoveNull<T> = ExpandRecursively<{ [K in keyof T]: Exclude<RemoveNull<T[K]>, null> }>
Kullanım :
function removeEmpty<T extends object>(obj: T): RemoveNull<T> {
return Object.fromEntries(
Object.entries(obj)
.filter(([_, v]) => v != null)
.map(([k, v]) => [k, v === Object(v) ? removeEmpty(v) : v])
) as RemoveNull<T>
}
Oyun alanı
Cevap #2
export function removeNull<T extends object>(obj: T | any) {
Object.keys(obj).forEach(k => {
const key = k as keyof T
if (obj[key] && typeof obj[key] === 'object') removeNull(obj[key])
else if (obj[key] == null) delete obj[key]
})
return obj
}
Yukarıdaki kod ile null öğeleri kaldırabilirsiniz. Ayrıca tipinizi verebilirsiniz ve tüm iç içe geçmiş nesne özelliklerini kaldıracaktır.
