在TypeScript中,多余的属性检查将应用于对象文字,但不能超过此范围。 (这是有意的documented behavior。)因此:
interface Example {
id: number;
name: string;
}
// ...
function doSomething(ex: Example) {
// ...
}
此操作失败(playground link):
doSomething({
id: 42,
name: "Life, the Universe, and Everything",
extra: "not allowed" // Error 2345: Object literal may only specify known properties, and 'extra' does not exist in type 'Example'.
});
但这不是(playground link):
const ex = {
id: 42,
name: "Life, the Universe, and Everything",
extra: "not allowed"
};
doSomething(ex);
是否可以以某种方式定义接口,即使不使用对象文字也可以禁止多余的属性?例如,各种“ final
”接口?
如果没有,那么在运行时很容易完成,但是如果在类型定义中有一种方法可以做到,那将很有用。
答案 0 :(得分:4)
您要查找的是确切类型。此功能自GH以来一直在讨论中,但尚未接近实际实现。令人担忧的是(至少从我在Anders tsConf上所听到的)是,精确类型会创建一个分叉的类型系统,在这种系统中,您不能将精确类型分配给不精确的类型,也不能反向分配,这会使开发人员的体验更加糟糕。
有解决方法,但都存在某些缺陷,您可以阅读GH问题,以找到各种版本,这些版本可能会根据您要尝试的工作而发挥足够的作用。