空接口允许任何对象吗?

2023-12-25

为什么空接口不要求对象为空?

interface A {};
const a: A = {a: 1};
console.log(a);

是有效的代码并将输出{ a: 1 }.

我认为添加可选属性应该可以正常工作,但是

interface A {};
interface B extends A {
    b?: any;
}
const a: B = {a: 1};
console.log(a);

以错误结束Type '{ a: number; }' is not assignable to type 'B'.

  • 如果接口定义了对象必须具有的属性,则 B 情况应该可以正常工作,所有必需的属性都存在。
  • 如果接口定义了对象可以具有哪些属性,则情况应该会导致错误,a接口中没有定义。

非空接口定义了对象可以和必须具有的内容。 空界面的行为类似于any.

有没有解释为什么空接口的行为如此?这是故意的还是只是一个错误?


这种行为是故意的。

当目标是空对象类型时,不会执行多余的属性检查,因为很少有只允许空对象的意图。


其实,你can assign {a: 1}对于B来说,这里的其他答案大多是错误的。

你在 TypeScript 中偶然发现了另一个有点令人困惑的怪癖,即你不能直接赋值类型的对象字面量,其中对象字面量包含除该类型中指定的属性之外的其他属性。

但是,您可以将对象的任何现有实例分配给类型,只要它满足该类型即可。

例如:

interface Animal {
    LegCount: number;
}

let dog: Animal = { LegCount: 4, Fur: "Brown" }; // Nope

var myCat = { LegCount: 4, Fur: "Black" };
let theCat: Animal = myCat; // OK

当您的类型为空时,此约束将被忽略。

阅读更多here https://github.com/Microsoft/TypeScript/issues/3755 and here https://basarat.gitbooks.io/typescript/content/docs/types/freshness.html.

Typescript 团队稍后提供的答案可在GitHub https://github.com/Microsoft/TypeScript/issues/14606#issuecomment-285956509.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

空接口允许任何对象吗? 的相关文章

随机推荐

  • 如何在 Android O 中设置 Firebase 通知 ChannelID?

    对于 API 级别 26 我们必须设置一个通道 id 作为参考 我学会了如何在没有 ChannelID 的情况下做到这一点 下面是我的 Firebase 消息传递设置代码 但现在对于新的 Android api 26 级别 Notifica
  • f:convertDateTime 支持 Java8 LocalDate / LocalDateTime? [复制]

    这个问题在这里已经有答案了 JSF 核心标签f 转换日期时间 https docs oracle com javaee 7 javaserver faces 2 2 vdldocs facelets f convertDateTime ht
  • 判断一个数字是否是 scala 中的好数字

    您好 我是 Scala 函数式编程方法的新手 我想在我的函数中输入一个数字并检查它是否是一个好数字 如果一个数字的每个数字都大于该数字右侧的数字之和 则该数字是一个好数字 例如 9620 相当于 2 gt 0 6 gt 2 0 9 gt 6
  • 如何有效去除字符串的一部分

    有一个像 A B C D E F 这样的字符串 如何删除 C D 部分并得到像 A B E F 这样的字符串 要么只是将其替换掉 input Replace C D 或者使用上一个问题的解决方案之一 将其从数据结构中删除并将其重新连接在一起
  • 从 Struts2 应用程序中的 FreeMarker 获取模板文本

    我想使用 Freemarker 在 Struts2 应用程序中生成电子邮件 由于我也在使用 Freemarker 来实现我的观点 因此我想 重用 相同的配置 使用 Spring 做同样的事情已经有一个类似的问题 在 Spring 应用程序中
  • Java 包装器到 Perl/Python 代码

    我必须在仅支持 Java 的服务器上部署一些 Web 服务 但其中一些将使用 perl 或 python 完成 我想知道是否可以开发一个 Java 包装器来调用用 perl 或 python 编写的特定代码 因此 我希望所有的 Web 服务
  • 如何减少 GC 期间弱引用的处理时间?

    目前 我面临的问题是我的应用程序偶尔会显示较长的 GC 时间 但所有这些都只是由弱引用处理引起的 所以线程停止时间总是接近弱引用处理时间 所有其他 GC 周期均为 0 0001 秒至 0 200 秒 来自 gc log 重新格式化 1038
  • 如何从初始 LocalDateTime 和 cron 表达式获取下一个 LocalDateTime?

    我有一个初始日期和一个 cron 表达式 我怎样才能找到满足这个 cron 表达式的下一个日期 String cronExpresion LocalDateTime initial LocalDateTime now LocalDateTi
  • React 中的可搜索下拉菜单

    我有以下反应列表
  • 应用程序首次打开时的条件页面显示

    您好 我刚刚开始学习 Angular Angular UI Router 并试图找出如何确定应用程序首次打开的时间 以将用户发送到登录页面或主页 这是我到目前为止所拥有的 codeArtApp config function statePr
  • 无法使用带有 x-www-form-urlencoded 参数的 JSOUP 登录网站

    我如何使用来实现以下请求Jsoup http jsoup org POST 登录 用户 HTTP 1 1主机 url publishedprices co il缓存控制 无缓存 内容类型 application x www form url
  • 关于 C# 字符串的问题:不变性和克隆

    我正在阅读 Accelerated C 2010 并且有几个问题 问题1 String 的实例是不可变的 一旦你创造了它们 你无法改变它们 这是真的吗 我已经有一段时间没有使用 C 了 而且我才刚刚开始 所以我什至在语法上也可能是错误的 s
  • Git 子模块 — 排除特定文件/目录

    我正在尝试使用 Git 的 子模块 功能在项目中包含第 3 方代码 我只需要子模块中的几个文件 并希望排除它附带的所有文档等 我怎样才能做到这一点 在我的子模块中我有一个 examples我想删除的文件夹locally防止自动生成的 mak
  • Polymer 1.0:如何将参数从属性传递给 Polymer 函数?

    有没有办法将参数从 Polymer 函数内部的元素属性传递给 Polymer 函数
  • 如何使用nodejs动态创建Mongodb模式

    我想知道是否可以使用 Mongoose 模式 Node js 和 Angular 在 mongodb 中动态创建表 创建模式的基本方法是在 Node js 中显式创建模型 如下所示 import mongoose from mongoose
  • 在TFS中使用Tortoise SVN diff

    我想将 Tortoise SVN diff 实用程序与 TFS 一起使用 我知道如何在 TFS 中配置用户工具 我需要的是 Tortoise SVN diff 实用程序的安装程序 我想我需要安装完整的 Tortoise SVN 才能获取 S
  • 将数据源动态绑定到应用程序制造商弹出窗口

    我需要有一个通用的 删除确认 弹出窗口 并使用弹出窗口出现之前触发的事件将数据源动态绑定到弹出窗口 单击 位置 页面上的删除图标时 将出现弹出窗口 截图如下 我需要同时设置弹出窗口的数据源 当用户单击此删除图标时 并且当用户单击弹出窗口上的
  • Rcmd 检查:“:::”调用导入的未导出对象

    这个问题与Rcmd check在 R Devel 3 1 0 中 我正在维护一个包 称之为 A 它 依赖于 另一个包 让我称之为第二个包 B 出于以下原因 我使用 依赖 而不是 导入 大多数使用 A 包的人也使用 B 包 包 A 广泛使用包
  • WebRTC 无法在 iOS Safari 上的 Angular 5 中工作

    我正在使用 WebRTC 构建一个应用程序 但它无法在 iOS Safari 上的 Angular 5 中运行 我使用原生 WebRTC API 没有框架 首先没有 Angular 为了证明我的观点 Angular 是问题所在 我使用纯 h
  • 空接口允许任何对象吗?

    为什么空接口不要求对象为空 interface A const a A a 1 console log a 是有效的代码并将输出 a 1 我认为添加可选属性应该可以正常工作 但是 interface A interface B extend