为什么 TypeScript 在隐式类型返回对象上返回无效属性时不引发错误?



我正在尝试创建一个函数签名,帮助调用者只返回关联类型上存在的属性。我使用Partial<Record<keyof...模式来实现这一点。如果调用者显式地设置了返回类型,那么我所寻找的类型安全性就完成了,并且他们看到他们传入了一个无效的类型。但是,如果它们只是隐式返回一个对象(我无法控制(,那么函数编写器似乎能够在返回对象中返回无效字段。

有人明白为什么会这样吗?

interface CatInfo {
age: number;
breed: string;
}
function expected(): Record<keyof CatInfo, CatInfo> {
const cats: Record<keyof CatInfo, CatInfo> = {
age: { age: 4, breed: 'oo'},
breed: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" }, // correctly errors, because boris is not in keyof CatInfo
};
return cats;
}
function notExpected(): Record<keyof CatInfo, CatInfo> {
const cats = {
age: { age: 4, breed: 'oo'},
breed: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" }, // why doesn't this throw an error?
};
return cats;
}
expected().age;
// ^?

我在打字游戏场上有这个

这种情况下的错误可能有点误导。该错误基于声明的变量和函数的预期返回,而这些变量和函数在类型检查中不匹配。通过声明返回的类型,然后声明返回对象的类型,就可以通知解释器足够的信息来检测错误并标记它

在第二个函数中,解释器检查返回是否符合CatInfo接口的条件,但仅此而已,因为它确实符合这些条件,所以这里不会出现运行时错误,这就是为什么如果注释掉bread,你会看到错误弹出窗口,但在注释掉boris时不会。当查看这两个函数相同的JavaScript时,这一点会更加明显。

最新更新