gpt4 book ai didi

typescript - removeUndefined 方法应该具有什么类型签名?

转载 作者:行者123 更新时间:2023-12-04 01:10:22 25 4
gpt4 key购买 nike

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运营商,这是不可以的)
我的解决方案,不会改变任何东西
更新
我换了 FilterTrueValuesPick 更新 (我希望这是最后一个:D)
我加了 IsAny实用程序,因为我忘记了我们不应该在 strictNullChecks模式。对此表示歉意。
感谢@VLAZ 指出这一点!
请记住,如果您有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com