typescript - 是否有一种类型安全的方式来表示函数在传递 T 时返回 T 类型的对象,但返回 Partial 类型的对象什么时候通过的?
问题描述
我正在编写函数来清理传递给我的 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()
take 和 return a Partial<IUser>
,因为那样我就失去了确保我选择了所有属性的类型检查器。实现本身将起作用,因为 pick 只会跳过在源对象中找不到的属性。
我尝试制作签名cleanUser<T extends Partial<IUser>>(user: T): T
以表示我正在返回传入的相同内容,但只是告诉我返回值不可分配给T
. 我尝试添加一个重载签名cleanUser<Partial<IUser>>(user: Partial<IUser>)
,但即使传入普通用户,TS 也会选择它。
有没有一种干净的方式来表达这一点,或者我只是去“我知道我在做什么”并抑制类型错误?
解决方案
您可以为此使用函数重载:
function cleanUser(user: IUser): IUser;
function cleanUser(user: Partial<IUser>): Partial<IUser>;
function cleanUser(user): any {
return _.pick(user, 'username', 'password');
}
推荐阅读
- php - 从 PHP 中的顺序数组创建嵌套数组
- node.js - Conda 无法识别我已安装节点?
- bootstrap-4 - bootstrap.min.js:6 Uncaught TypeError: n is not a constructor return when I click the dropdown button
- sql - 自连接以从下一行的 customer_in_time 中减去一行的 customer_out_time
- javascript - 无法从外部函数中提取价值
- image - Flutter 裁剪 2 个旋转图像
- javascript - 使用javascript从html页面获取数据
- java - Android volley 返回 clienterror 400 [Bad request]
- javascript - 如何在 React JS 中仅显示结果但消失按钮
- python - 即使在指定error_bad_lines = False之后,在pandas中也会出现解析器错误