从 Typescript 中的对象中删除空属性
Remove null attributes from an Object in Typescript
参考Remove blank attributes from an Object in Javascript,如何兼容Typescript?
JS 函数(嵌套对象 | 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>
但它不适用于嵌套对象,我认为这不是正确的实用程序。
请注意,返回的类型应删除 null
类型但保留 undefined
.
Example/Expected 行为:
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
类型类似于:
type ResultTestTypeExample = {
a?: {
b?: {
c: string;
};
z?: {
x: string;
};
};
};
这对你有用吗?
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> }>
用法:
function removeEmpty<T>(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>
}
参考Remove blank attributes from an Object in Javascript,如何兼容Typescript?
JS 函数(嵌套对象 | 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>
但它不适用于嵌套对象,我认为这不是正确的实用程序。
请注意,返回的类型应删除 null
类型但保留 undefined
.
Example/Expected 行为:
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
类型类似于:
type ResultTestTypeExample = {
a?: {
b?: {
c: string;
};
z?: {
x: string;
};
};
};
这对你有用吗?
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> }>
用法:
function removeEmpty<T>(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>
}