gpt4 book ai didi

TypeScript 通过对象解构允许不正确的属性

转载 作者:行者123 更新时间:2023-12-05 04:41:18 25 4
gpt4 key购买 nike

我在使用 TypeScript 时遇到了一个问题,即使用一种类型的对象可以通过破坏性赋值注入(inject)到另一个使用完全不同类型的对象中,而 TypeScript 不会显示任何错误。

一个例子是:

interface Pizza {
cookingTime: number;
size: "Small" | "Medium" | "Large";
}

interface Car {
modelName: string;
yearManufactured: number;
}

const produceMalformedPizza = (car: Car): Pizza => {
return {
...car, // This is not a "Pizza" object but no errors are raised
cookingTime: 10,
size: "Small",
}
}

console.log(
produceMalformedPizza({
modelName: "NotAPizza",
yearManufactured: 1980
})
)

/* Output:
[LOG]: {
"modelName": "NotAPizza",
"yearManufactured": 1980,
"cookingTime": 10,
"size": "Small"
}
*/

我已经尝试打开所有可能的严格标志 — 你可以看到它正在编译 online here .

如果我尝试在 produceMalformedPizza 函数中返回任何特定属性,那么编译器会按预期引发错误 — 但似乎我可以使用解构(展开)赋值注入(inject)任意对象数据.

我是 TypeScript 的新手,所以这也许是预期的行为? IE。我不能使用具有推断类型安全性的对象传播解构吗?

编辑:

根据@T.J.Crowder 的回答,这是故意的。

最佳答案

这是预期的行为。您要返回的对象是 Pizza子类型 — 它具有 Pizza 需要的所有属性(加上一些不需要的属性)。

TypeScript 确实会进行“过多的属性检查”,但仅限于有限的情况。例如,如果您要在该对象字面量中显式放置一个非 Pizza 属性,TypeScript 会将其标记出来,并不是因为从类型的角度来看它实际上是错误的(使用子类型没问题),而是因为这可能是程序员的错误。

我有点惊讶它没有对 ...car 执行此操作(因为 car 具有必需的属性),但它不会进行额外的属性检查在所有情况下。

关于TypeScript 通过对象解构允许不正确的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70110432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com