TypeScript 允许在赋值中使用多余的属性,如果它们在满足检查中被使用,

gxwragnw  于 5个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(58)

🔎 搜索词

已知属性满足,子类型

🕗 版本与回归信息

  • 在我尝试的每个版本中,这种行为都是如此,我还查阅了关于已知属性检查的FAQ条目

⏯ Playground链接

https://www.typescriptlang.org/play/?ts=5.6.0-dev.20240723#code/JYOwLgpgTgZghgYwgAgILIN4Chm+TAewIC5kQBXAWwCNoBuLAXyy1ElkRQCFkIAPSCAAmAZzSYceanCikRYKKADmDZlgA2EMMgLUAVqVQMsuvcgC8mQiWQAmADTJps5ACIlUCAE9XjZCLgwYBEYYAgxLjogA

💻 代码

interface A {
    foo: number;
}

interface B extends A {
    bar: string;
}

let obj: A;

obj = {foo: 2, bar: "grey"} satisfies B;

🙁 实际行为

抛出错误:

Object literal may only specify known properties, and 'bar' does not exist in type 'A'.

🙂 预期行为

该属性应该被允许,因为我在 satisfies 中指定了类型,并且它是变量类型的子类型

关于问题的附加信息

  • 无响应*
sqyvllje

sqyvllje1#

这当然违背了直觉,但我从未见过任何东西表明satisfies检查会导致多余的属性检查被省略。
向字面量添加类型Assert可以避免except属性检查。

obj = {foo: 2, bar: "grey"} satisfies B as B;
bttbmeg0

bttbmeg02#

在这种情况下,这个对象字面量会触发两次额外的属性检查(:

obj = {foo: 2, bar: "grey", extra: 42} satisfies B
tpxzln5u

tpxzln5u3#

根据satisfies的设计,它正尽最大努力保持一致性,就好像你单独写了

{foo: 2, bar: "grey"} satisfies B;
obj = {foo: 2, bar: "grey"};

我们实际上没有一个类型操作对应于这里所请求的内容——一旦对象字面量“unfreshened”,其他操作就会开始失败(例如字面量缩小)。

相关问题