首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么`Omit<undefined,‘foo’>似乎会产生‘Why’>?

为什么`Omit<undefined,‘foo’>似乎会产生‘Why’>?
EN

Stack Overflow用户
提问于 2022-09-25 08:48:00
回答 1查看 21关注 0票数 0

似乎我可以为这种类型分配任何我想要的,没有错误-它实际上是any。为什么会这样呢?

代码语言:javascript
代码运行次数:0
运行
复制
type OmittedUndefined = Omit<undefined, 'foo'>;

let a: OmittedUndefined = 1234;
a = "asdflkjasdf";
a = { hello: 1234 };

游乐场

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 09:09:30

您需要查看省略的定义:

代码语言:javascript
代码运行次数:0
运行
复制
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
}

这允许我们将您的Omit<undefined, 'foo'>类型减少如下:

代码语言:javascript
代码运行次数:0
运行
复制
Omit<undefined, 'foo'> =
Pick<undefined, Exclude<keyof undefined, 'foo'>> =
Pick<undefined, never> =
{
    [P in never]: undefined[P];
} =
{}

我们得出的结论是,Omit<undefined, 'foo'>类型相当于一个空接口。

注意,当对象文字包含比类型中指定的属性更多的属性时,通常不能将对象文字直接分配给类型。但是在一个空接口的情况下,这个检查没有完成,这样的分配将是成功的。

空接口的这种特殊行为可能会让人感到困惑,这就是为什么静态分析工具会标记空接口。

请参阅https://rules.sonarsource.com/typescript/RSPEC-4023

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73843163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档