登录
首页 >  文章 >  前端

可选与未定义:如何检查可选属性

来源:dev.to

时间:2024-07-29 08:30:41 215浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《可选与未定义:如何检查可选属性》,聊聊,我们一起来看看吧!

可选与未定义:如何检查可选属性

在 typescript 中,如果可以从对象中省略某个属性,则该属性被认为是可选的,这意味着它可以是未定义的,也可以是根本不提供的。可选属性使用 ? 表示属性键上的后缀。确定一个属性是可选的还是显式定义为 undefined 的类型可能非常棘手。

让我们考虑以下具有五种可能组合的示例:

type example = {
    required: number;
    optional?: number;
    requiredasundefined: undefined;
    requiredwithundefined: number | undefined;
    optionalwithundefined?: number | undefined;
}

最后四个属性允许未定义,但实际上只有第二个和第五个属性是可选的。有趣的是,可选属性、requiredwithundefine 和optionalwithundefine 都解析为相同的联合类型编号 |未定义.

所以,我们想要的是一个类型,对于可选和可选的带未定义返回 true,对于其余的返回 false。以下是此类实用程序类型的外观:

type isoptional<t, k extends keyof t> = undefined extends t[k]
    ? ({} extends pick<t, k> ? true : false)
    : false;

type required = isoptional<example, 'required'>;  // false
type optional = isoptional<example, 'optional'>;  // true
type requiredasundefined = isoptional<example, 'requiredasundefined'>;  // false
type requiredwithundefined = isoptional<example, 'requiredwithundefined'>;  // false
type optionalwithundefined = isoptional<example, 'optionalwithundefined'>;  // true

此实用程序类型有两个限制。第一个约束 undefined extends t[k],检查 undefined 是否可以是 t[k] 访问的类型的一部分。它本质上询问类型 t[k] 是否可以包含 undefined。第二个约束,{} 扩展 pick<t, k> ? true : false,确保类型 {} (空对象)可分配给选择属性 k 的类型,这意味着该属性是可选的。

从这个实用程序类型中,我们可以构建一个新的映射类型,它只选择可选属性。非可选属性将设置为 never:

type optionalproperties<t> = {
    [k in keyof t]: isoptional<t, k> extends true 
        ? t[k] 
        : never
}

type onlyoptionals = optionalproperties<example>;
// type onlyoptionals = {
//     required: never;
//     optional?: number;
//     requiredasundefined: never;
//     requiredwithundefined: never;
//     optionalwithundefined?: number | undefined;
// }

拥有类型为 never 的属性通常足以保证类型安全,但如果我们确实想出于风格目的而省略这些属性,我们可以将 isoptional<t, k> 将 true 约束扩展到方括号中。这是一个很好的小技巧,因为它将非可选属性的键设置为 never,然后 typescript 会自动忽略它。

type OnlyOptionals<T> = {
    [K in keyof T as IsOptional<T, K> extends true ? K : never]: T[K]
} 
type OnlyOptionals = OnlyOptionals<Example>;
// type OnlyOptionals = {
//    optional?: number;
//    optionalWithUndefined?: number | undefined;
// }

这里是直接在浏览器中尝试的 playground:typescript playground

好了,本文到此结束,带大家了解了《可选与未定义:如何检查可选属性》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

声明:本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>