typescript - 闭包编译器类型 !Object 的 TypeScript 等价物是什么?
问题描述
在Closure Compiler 类型系统中,!Object<string, !MyClass>
(或等效地!Object<!MyClass>
)是一种值类型,它是用作字典的(非空)对象,具有任意字符串作为键和 MyClass 的(非空)实例作为值。(请注意,如果myDict
是这种类型,那么myDict[str]
可能是undefined
,但str in myDict
暗示myDict[str] instanceof MyClass
。)
如何在 Typescript 类型系统中表达相同的类型?
有什么方法可以额外指定这样一个字典对象的原型必须为空(即由? 生成Object.create(null)
?(AFIAK 闭包类型系统不提供指定这一点的方法。)
解决方案
!Object<string, !MyClass>
(或等效地!Object<!MyClass>
)是一种值类型,它是用作字典的(非空)对象,具有任意字符串作为键和 MyClass 的(非空)实例作为值。
const myDict: Record<string, MyClass> = {};
这是索引签名的现成简写。这将是等价的:
const myDict: { [key: string]: MyClass } = {};
为了确保什么都没有null
,您还需要启用strictNullChecks
编译器选项(它也包含在 中strict
)。除非明确提及,否则这将null
作为可能的值在任何地方删除,例如,允许但其本身不允许。MyClass | null
nulls
MyClass
有没有办法额外指定这样一个字典对象的原型必须为空
不,这是不可能的。TypeScript 不区分用作原型的内容。它只对类型相等进行结构匹配,因此Object.create(null)
和{}
是等价的,因为它们只是对象。只要看起来与接口匹配,类型系统就不会检查用于创建给定对象的对象。
推荐阅读
- html - 如何解决猫头鹰轮播点不可见的错误
- java - @MapKeyColumn 在休眠默认值错误
- laravel - Wherenull 查询不从数据透视表返回任何内容(laravel5.5)
- python - 使用 Pymunk 和 Pygame 进行横向滚动。如何移动相机/视口以仅查看世界的一部分?
- c++ - Cmake 和多阶段构建管道(重用)
- machine-learning - PySpark 中的加速故障时间模型用于对重复事件进行建模
- ruby-on-rails - 无法识别正确的 CSS 选择器以使用 Mechanize 进行抓取
- python - tensorflow:请使用 `rate` 而不是 `keep_prob`。速率应设置为 `rate = 1 - keep_prob`
- ros - ROS旋律catkin_make失败
- list - 如何制作一个放在批处理文件中的参数列表?