似乎我可以为这种类型分配任何我想要的,没有错误-它实际上是any
。为什么会这样呢?
type OmittedUndefined = Omit<undefined, 'foo'>;
let a: OmittedUndefined = 1234;
a = "asdflkjasdf";
a = { hello: 1234 };
发布于 2022-09-25 01:09:30
您需要查看省略的定义:
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'>
类型减少如下:
Omit<undefined, 'foo'> =
Pick<undefined, Exclude<keyof undefined, 'foo'>> =
Pick<undefined, never> =
{
[P in never]: undefined[P];
} =
{}
我们得出的结论是,Omit<undefined, 'foo'>
类型相当于一个空接口。
注意,当对象文字包含比类型中指定的属性更多的属性时,通常不能将对象文字直接分配给类型。但是在一个空接口的情况下,这个检查没有完成,这样的分配将是成功的。
空接口的这种特殊行为可能会让人感到困惑,这就是为什么静态分析工具会标记空接口。
https://stackoverflow.com/questions/73843163
复制相似问题