【发布时间】:2021-11-26 02:20:17
【问题描述】:
我遇到了 TypeScript 的问题,即使用一种类型的对象可以通过破坏性赋值注入到使用完全不同类型的另一个对象中,而 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 函数中返回任何特定属性,那么编译器会如预期的那样引发错误 — 但似乎我可以使用解构(扩展)赋值注入任意对象数据。
我对 TypeScript 比较陌生,所以也许这是预期的行为? IE。我不能使用具有推断类型安全性的对象传播解构?
编辑:
根据@T.J.Crowder 的回答,这是故意的。
- 这里有一些关于这个问题的 GitHub 讨论:https://github.com/microsoft/TypeScript/issues/43499,
- 还有一个支持“精确”类型的提案:https://github.com/microsoft/TypeScript/issues/12936
【问题讨论】:
标签: typescript