网站搜索

javascript - Typescript 的 Omit<> 在展开带有被省略属性的对象时不会显示错误


为什么 TypeScript 看不到我正在尝试展开类型为 Human 的对象,而这个对象有一些属性在类型 Baby 中不存在?这不仅对这个示例有效,它对任何属性的超集对象都有效。对于 TypeScript 来说,不显示错误的条件只是对象拥有类型的所有属性,但你可以传入比需要的更多的属性。为什么?如果我可以将任何属性的超集对象传递给类型,那么类型的意义何在……

我真的必须手动从上层对象中挑选属性,以确保我不会传递超过我需要的东西吗。想象一下,如果我省略了100个属性并展开对象,仍然在内存中得到所有这些属性。那就违背了我类型的目的。

interface Human {
  name: string;
  surname: string;
  age: number;
}
const human1: Human = {
  name: "Chad",
  surname: "Lingovski",
  age: 26,
};
type Baby = Omit<Human, "age">;
const baby1: Baby = { ...human1 }; //this is allowed, why?
const baby2: Baby = { name: "Chad", surname: "Lingovski", age: 26 }; //this is not allowed

我预计 TypeScript 会显示错误。它不让我访问 age 属性,但我可以在控制台打印整个对象,age 属性是存在的。