为什么未声明的对象属性未标记为错误?

时间:2012-11-03 21:35:53

标签: typescript

var opts: {n?: number; s?: string;};
opts = {n: 2};     // Ok
opts = {s: 'x'};   // Ok
opts = {};         // Ok
opts = {z: 3};     // Ok, but shouldn't this be an error?

我希望opts对象不接受任何声明或任何声明的对象 可选属性(但没有其他属性),但它接受其他未定义的属性 属性,即声明等同于opts: {};,是这样的 一个bug?

如果这不是一个错误你怎么能构建这样的声明?

1 个答案:

答案 0 :(得分:2)

TypeScript的一部分优点在于它在决定是否可以将对象强制转换为其他类型时非常聪明。

opts的声明实际上没有要求,因为这两个属性都是可选的,因此任何任何对象都与此类型兼容。为了兼容,对象必须包含所有必需的属性 - 在这种情况下,没有必需的属性。

如果我们查看一个需要属性的调整后的示例,那就更清楚了:

var opts: {a: bool; n?: number; s?: string;};

opts = {a: true, n: 2};     // Ok
opts = {a: true, s: 'x'};   // Ok
opts = {a: true};         // Ok
opts = {a: true,z: 3};     // Ok
opts = {}; // not ok
opts = {z: 3}; // not ok

所以这意味着如果一个对象支持至少所需的属性,则该对象被视为另一个对象的子类型。

这涉及设置对象。现在,如果您考虑使用该对象,您将看到权力所在的位置。由于类型仅承诺ns(以及我的示例中的a),因此n上的代码调用属性只能请求这些属性。无法访问其他属性:

var opts: {a: bool; n?: number; s?: string;};

opts = {a: true, n: 1, s: 'Hi', z: 3};

var x - opts.z; // not ok

所以我们仍然有类型安全性,因为我们只能使用类型声明中的属性 - 而不是其他属性。