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: {};
,是这样的
一个错误?
如果这不是一个错误,你如何构建这样的声明?
最佳答案
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
因此,这意味着如果一个对象至少支持所需的属性,则该对象将被视为另一个对象的子类型。
这涉及设置对象。现在,如果您考虑使用该对象,您就会看到其威力所在。因为该类型仅 promise n
和 s
(以及我的示例中的 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
因此我们仍然具有类型安全性,因为我们只能使用类型声明中的属性,而不能使用其他属性。
关于typescript - 为什么未声明的对象属性不会被标记为错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213739/