typescript - 为什么未声明的对象属性不会被标记为错误?

标签 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: {};,是这样的 一个错误?

如果这不是一个错误,你如何构建这样的声明?

最佳答案

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 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

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

关于typescript - 为什么未声明的对象属性不会被标记为错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13213739/

相关文章:

javascript - 使用 javascript/typescript 创建一个对象数组,使其具有 3 个数组的所有可能性组合

javascript - 即使在 subscribe() 函数中为其分配数据后,变量数据也不会保留以绑定(bind)在 HTML 中

typescript - 无法使用 TypeScript 将 prop 传递给 svelte 中的组件

browser - 如何在浏览器中编译 TypeScript 代码?

javascript - 从键和值是动态的数组中搜索字符串

typescript - 泛型函数的返回类型

javascript - 获取 api 请求时如何捕获错误?

angular - 如何在 Angular 中正确刷新组件模板?

javascript - child 在 Angular 2 中监听父事件

javascript - 订阅 observable 返回 undefined