gpt4 book ai didi

typescript - 是否有一种类型安全的方式来表示函数在传递 T 时返回 T 类型的对象,而在传递它时返回 Partial 类型的对象?

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:02 25 4
gpt4 key购买 nike

我正在编写函数来清理传递给我的 CRUD 操作的输入;例如我不希望创建或更新用户的操作能够设置一个指示不受限制的管理员的内部标志。

为此我只使用 lodash 的 _.pick仅投影输入中的已知属性:

interface IUser {
username: string;
password: password;
}

interface IUserInternal {
superuser: boolean;
}

function cleanUser(user: IUser): IUser {
return _.pick(user, 'username', 'password');
}

function createUser(user: IUser) {
db.create(cleanUser(user));
}

function updateUser(id: string, user: Partial<IUser>) {
const old = db.get(id);
db.update(id, {...old, ...cleanUser(user)});
}

我不能在这里依赖类型检查,因为这是在服务边界,在添加全面的验证之前,我想暂时坚持一些快速而肮脏的事情。

上面的问题在最后一点:我不能调用cleanUser()Partial<IUser> 上明显地。我也不能cleanUser()接受并返回 Partial<IUser> ,因为那样我就失去了确保我选择了所有属性的类型检查器。实现本身会起作用,因为 pick 只会跳过在源对象中找不到的属性。

我尝试制作签名cleanUser<T extends Partial<IUser>>(user: T): T表示我正在返回传入的相同内容,但只是告诉我返回值不可分配给 T .我尝试添加过载签名 cleanUser<Partial<IUser>>(user: Partial<IUser>) ,但是即使在传递普通用户时,TS 也会选择它。

是否有一种简洁的方式来表达这一点,或者我只是“我知道我在做什么”并抑制类型错误?

最佳答案

你可以使用 function overloads为此:

function cleanUser(user: IUser): IUser;
function cleanUser(user: Partial<IUser>): Partial<IUser>;
function cleanUser(user): any {
return _.pick(user, 'username', 'password');
}

关于typescript - 是否有一种类型安全的方式来表示函数在传递 T 时返回 T 类型的对象,而在传递它时返回 Partial<T> 类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54634788/

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