作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
JavaScript 代码库中的一项常见任务涉及从对象中删除未定义的值,如下所示:
function removeUndefined(myObj: any): any {
const copyObj = { ...myObj };
Object.keys(copyObj).forEach((key) => (copyObj[key] === undefined) && delete copyObj[key]);
return copyObj;
}
考虑以下场景:
interface QueryObject {
id?: number;
email?: string | null;
createdAt?: Date | null;
}
async function runQuery(query: QueryObject) {
const cleanQuery = removeUndefined(query); // type is 'any'
await engine.run(cleanQuery);
}
就我而言,我无法打开
strictNullChecks
,据我所知,这是阻止
cleanQuery
的唯一方法。对象接收类似
{ id: undefined }
的内容将使其类型等同于
{ id: number } | { id: number; email: string | null; } | ...
.这真的是最好的行动方案吗?
cleanQuery
实现这样的返回类型?
最佳答案
我为活跃和残障人士制作了它 strictNullChecks
选项。
主要是因为我忽略了:DstrictNullChecks: true
type RemoveUndefined<T> = {
[P in keyof T]: undefined extends T[P] ? never : null extends T[P] ? never : P
}[keyof T]
type Keys<T> = Array<keyof T>
const keys = <T,>(obj: T) => Object.keys(obj) as Keys<T>
const isFalsy = <T,>(elem: T) => elem === undefined || elem === null
const removeUndefined = <T,>(myObj: T) =>
keys(myObj)
.reduce((acc, elem) => isFalsy(elem) ? acc : { ...acc, [elem]: myObj[elem] }, {} as Pick<T, RemoveUndefined<T>> )
const result = removeUndefined({ age: 'hello', name: undefined, surname: null }) // { age: 'hello' }
我不喜欢下一个解决方案:
function removeUndefined(myObj: any): any {
return Object.keys(myObj).forEach((key) => (myObj[key] == null) && delete myObj[key]);
}
此函数改变对象并使用
delete
运营商,这是不可以的)
FilterTrueValues
与
Pick
更新 (我希望这是最后一个:D)
IsAny
实用程序,因为我忘记了我们不应该在
strictNullChecks
模式。对此表示歉意。
any
输入您的界面,您将在我的解决方案中遇到麻烦。我明天会弄清楚如何处理[任何]
strictNullChecks: false
type IsAny<T> = 0 extends (1 & T) ? true : false;
type FilterAny<T> = {
[P in keyof T]: IsAny<T[P]> extends true ? never : P
}[keyof T]
type RemoveUndefined<T> = {
[P in keyof T]: T[P] extends undefined ? never : T[P] extends null ? never : P
}[keyof T]
type Keys<T> = Array<keyof T>
const keys = <T,>(obj: T) => Object.keys(obj) as Keys<T>
const isFalsy = <T,>(elem: T) => elem === undefined || elem === null
const removeUndefined = <T,>(myObj: T) =>
keys(myObj)
.reduce((acc, elem) => isFalsy(elem) ? acc : { ...acc, [elem]: myObj[elem] }, {} as Pick<T, RemoveUndefined<T> & FilterAny<T>> )
const result = removeUndefined({ age: 'hello', name: undefined, surname: null }) // { age: 'hello' }
关于typescript - removeUndefined 方法应该具有什么类型签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65027688/
JavaScript 代码库中的一项常见任务涉及从对象中删除未定义的值,如下所示: function removeUndefined(myObj: any): any { const copyOb
我是一名优秀的程序员,十分优秀!