TypeScript 空类型和以never作为键的类型的行为不同,

xurqigkl  于 6个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(49)

🔎 搜索词

Map类型
未知

🕗 版本与回归信息

  • 在版本4.7.4和4.8.4之间发生了变化

⏯ Playground链接

https://www.typescriptlang.org/play?ts=5.4.0-dev.20231206#code/CYUwxgNghgTiAEYD2A7AzgF3gVwFw5QGsUkB3FAbgCgqMBPABwQEF4BeeAbwG0BpeAJYp4KEADcQMALr4oKOgF8qAemXx1APQD8NVfABySeAFEYMJDCrJ0WKPhTYIEeAB8CoAGZCQwV1wXsONR66vDaumqm5pbWmPAARvaOzm7YKJ7evm6sHNjBaqHhQA

💻 代码

declare const u: unknown;

type A = {[K in never]: any}
//   ^?

// No Error
const a: null | undefined | {} = u;
//    ^?

// Error
const b: null | undefined | A = u;
//    ^?

🙁 实际行为

类型 ab 似乎相同,但仅将 b 赋值给它们会导致错误。

🙂 预期行为

我不确定哪个更好,我认为要么没有错误,要么两个都有错误。

关于问题的附加信息

在版本4.7.4中,两者都是错误。

cnjp1d6j

cnjp1d6j1#

Map类型应该做什么?
无论如何,这似乎是有意为之的:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-8.html#improved-intersection-reduction-union-compatibility-and-narrowing
TypeScript现在认识到这一点,并允许从 unknown{} | null | undefined 的赋值。

kokeuurv

kokeuurv2#

如果将 unknown 分配给 null | undefeind | {} 是有意为之的,那么 a 的行为是正确的,但 b 不应该是一个错误。

jv2fixgn

jv2fixgn3#

我建议将示例简化为类似于 type A = {[K in never]: any} 的内容,这样可以重现行为,而不会出现条件类型的干扰。
相关:#49119 和 #49119(评论)

dl5txlt9

dl5txlt94#

嗯,看起来问题不是我Map了{},而是我创建了一个带有never键的类型。

vfh0ocws

vfh0ocws5#

我猜想这个问题的钢化版本看起来像这样:

$x_1a^b_1^x$

kmb7vmvb

kmb7vmvb6#

I'm not committing to take a fix for this since it's pretty niche, but if it's straightforward and doesn't break/slow down something else, we can take a PR

相关问题