?,typescript,google-closure-compiler"/>

首页 > 解决方案 > 闭包编译器类型 !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 闭包类型系统不提供指定这一点的方法。)

标签: typescriptgoogle-closure-compiler

解决方案


!Object<string, !MyClass>(或等效地!Object<!MyClass>)是一种值类型,它是用作字典的(非空)对象,具有任意字符串作为键和 MyClass 的(非空)实例作为值。

这将是Record<Keys, Type>实用程序类型

const myDict: Record<string, MyClass> = {};

这是索引签名的现成简写。这将是等价的:

const myDict: { [key: string]: MyClass } = {};

为了确保什么都没有null,您还需要启用strictNullChecks编译器选项(它也包含在 中strict)。除非明确提及,否则这将null作为可能的值在任何地方删除,例如,允许但其本身不允许。MyClass | nullnullsMyClass

有没有办法额外指定这样一个字典对象的原型必须为空

不,这是不可能的。TypeScript 不区分用作原型的内容。它只对类型相等进行结构匹配,因此Object.create(null){}是等价的,因为它们只是对象。只要看起来与接口匹配,类型系统就不会检查用于创建给定对象的对象。


推荐阅读