typescript - 是否可以定义一个总是应用过多属性检查的接口/类型?
问题描述
在 TypeScript 中,多余的属性检查适用于对象文字,但不会超出此范围。(这是有意记录的行为。)因此:
interface Example {
id: number;
name: string;
}
// ...
function doSomething(ex: Example) {
// ...
}
这失败了(游乐场链接):
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'.
});
但这不是(游乐场链接):
const ex = {
id: 42,
name: "Life, the Universe, and Everything",
extra: "not allowed"
};
doSomething(ex);
是否可以以某种方式定义接口,即使不使用对象字面量也禁止过多的属性?例如,某种“ final
”接口?
如果没有,它很容易在运行时完成,但如果在类型定义中有办法做到这一点,那将很有用。
解决方案
您正在寻找的是确切的类型。GH一直在讨论这个特性,但它还没有真正实现。令人担忧的是(至少从我在 tsConf 从 Anders 那里听到的)是精确类型会创建一个分叉的类型系统,您无法在其中从精确类型到不精确类型以及向后分配,这会使开发体验变得更糟。
有一些变通方法,但在某些方面都存在缺陷,您可以阅读 GH 问题以找到可能运行良好的各种版本,具体取决于您尝试执行的操作。
推荐阅读
- c# - 如何像 Microsoft Groove 音乐一样为 GridViewItem 图像设置动画
- java - 有没有办法从 Neo4j 图数据库自动生成 java 类
- python-3.x - 如何使用多索引数据框绘制两级 x-ticklabels
- java - 使用java将文件从父目录移动到子目录
- testing - Testcafe:轮询测试
- mysql - 同一列表/表中的 Linq 子查询
- python - Mac OS 上 PyQT5 应用程序中 textedit.clear() 的奇怪行为
- shell - 特定列号与特定字符串的模式匹配。没有分隔符或分隔符
- c# - AWS Lambda Selenium WebDriver - 加载 ibglib-2.0.so 时出错
- angular - 预期 = 1,接收 = 0 - 为什么我的函数没有在 Angular 测试中调用?