在 typescript 中,如果可以从对象中省略某个属性,则该属性被认为是可选的,这意味着它可以是未定义的,也可以是根本不提供的。可选属性使用 ? 表示属性键上的后缀。确定一个属性是可选的还是显式定义为 undefined 的类型可能非常棘手。
让我们考虑以下具有五种可能组合的示例:
type example = { required: number; optional?: number; requiredasundefined: undefined; requiredwithundefined: number | undefined; optionalwithundefined?: number | undefined;}
登录后复制
最后四个属性允许未定义,但实际上只有第二个和第五个属性是可选的。有趣的是,可选属性、requiredwithundefine 和optionalwithundefine 都解析为相同的联合类型编号 |未定义.
所以,我们想要的是一个类型,对于可选和可选的带未定义返回 true,对于其余的返回 false。以下是此类实用程序类型的外观:
type isoptional = undefined extends t[k] ? ({} extends pick ? true : false) : false;type required = isoptional; // falsetype optional = isoptional; // truetype requiredasundefined = isoptional; // falsetype requiredwithundefined = isoptional; // falsetype optionalwithundefined = isoptional; // true
登录后复制
此实用程序类型有两个限制。第一个约束 undefined extends t[k],检查 undefined 是否可以是 t[k] 访问的类型的一部分。它本质上询问类型 t[k] 是否可以包含 undefined。第二个约束,{} 扩展 pick ? true : false,确保类型 {} (空对象)可分配给选择属性 k 的类型,这意味着该属性是可选的。
从这个实用程序类型中,我们可以构建一个新的映射类型,它只选择可选属性。非可选属性将设置为 never:
type optionalproperties = { [k in keyof t]: isoptional extends true ? t[k] : never}type onlyoptionals = optionalproperties;// type onlyoptionals = {// required: never;// optional?: number;// requiredasundefined: never;// requiredwithundefined: never;// optionalwithundefined?: number | undefined;// }
登录后复制
拥有类型为 never 的属性通常足以保证类型安全,但如果我们确实想出于风格目的而省略这些属性,我们可以将 isoptional 将 true 约束扩展到方括号中。这是一个很好的小技巧,因为它将非可选属性的键设置为 never,然后 typescript 会自动忽略它。
type OnlyOptionals = { [K in keyof T as IsOptional extends true ? K : never]: T[K]} type OnlyOptionals = OnlyOptionals;// type OnlyOptionals = {// optional?: number;// optionalWithUndefined?: number | undefined;// }
登录后复制
这里是直接在浏览器中尝试的 playground:typescript playground
以上就是可选与未定义:如何检查可选属性的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2672424.html