typescript - Type Guard Typescript 未正确推断函数剩余参数
问题描述
我有一个带有类型保护和函数剩余参数的 Typescript 示例:
interface BaseProps {
username: string;
password: string;
}
type Props = BaseProps & (
| {isAdmin: true, adminName: string}
| {isAdmin: false}
)
// Doesn't works
const myFn = ({isAdmin, ...rest}: Props) => {
if(isAdmin === true) {
rest.adminName; // Property 'adminName' does not exist on type '{ username: string; adminName: string; } | { username: string; }'.
}
}
// It works
const myFn2 = (args: Props) => {
if(args.isAdmin === true) {
args.adminName;
}
}
其余参数和类型保护有什么问题?
更新解决方案:
我找到了解决方案,Assert Functions
用于解决问题。
declare function assertType<T>(val: unknown): asserts val is T;
const myFn = ({password, isAdmin, ...rest}: Props) => {
if(isAdmin === true) {
assertType<Omit<Props & {isAdmin: true}, keyof Props>>(rest);
rest.adminName; // <=== HERE
rest.username;
// Should be error
rest.password;
}
}
解决方案
的类型Props
是
{ 用户名:字符串,isAdmin:真,管理员名称:字符串 } | {用户名:字符串,isAdmin:假}
isAdmin
当您在类型对象Prop
(例如语句)上断言 的值时if
,打字稿能够缩小 和 之间的实际{ username: string, isAdmin: true, adminName: string }
类型{ username: string, isAdmin: false }
。
如果isAdmin
通过解构删除,则类型rest
变为
{ 用户名:字符串,管理员名称:字符串 } | {用户名:字符串}
值isAdmin
和rest
变得不相关,缩小类型的唯一方法rest
是断言adminName
属性的存在。
也许您不应该在这种特定情况下使用休息参数。您也可以rest
在if
.
推荐阅读
- terminal - 终端的条件 ZSH_THEME
- python - Python - 如何在单个图形中绘制来自多个文本文件的数据
- graphql - graphql-java 中的模拟 api 响应
- excel - 基于对齐方式排序
- docker - Hadoop 连接被拒绝,Docker 上的高可用性名称节点配置
- python - 连接两个 pandas 数据框进行分析
- javascript - 如何在一个 ajax 请求中添加文件和 html 类型数据
- javascript - 更改 HTML 内容后为 DIV 设置动画
- javascript - 输入字段中的连接符号
- oracle - 使用一个表作为另一个表计算的参考点