如何在Typescript中没有模块或库的情况下获取对象键?

问题描述

如何使用 Object.getownPropertyNames(myObj); 执行 Object.keys(myObj);for (k in myObj)"noLib": true 之类的操作?

我在使用 Property 'getownPropertyNames' does not exist on type 'ObjectConstructor'. 时遇到 error TS2318: Cannot find global type 'Extract'.for (k in value) 之类的错误

我正在尝试使用 Types for Adobe library 为带有 typescript 的 Adob​​e Illustrator 构建脚本,并且由于 Adob​​e 的扩展脚本不具备常见 JS 的所有功能,因此库的作者建议使用 "module": "none","noLib": truetsconfig.json

任何想法如何使这项工作?

解决方法

在任何您想要使用现代 JS 结构的 ExtendScript 项目中,您将需要大量的 polyfill。 (把它想象成以 IE8 为目标。)Babel 肯定会成为这种方法的一部分;还有一个 Babel preset for ExtendScript。在这种安排下,TypeScript 将输入 Babel,而 Babel 将生成实际的 ExtendScript。

至于您使用的库,他们推荐 "noLib": true,因为他们的类型重新声明了所有具有 ExtendScript 本身支持的有限接口的 JS 原语。如果您将使用 Babel,您应该让 TypeScript 以更现代的 JS 级别为目标,并让 Babel 处理其他细节。这意味着删除 "noLib" 并将 "target" 设置为类似 "ES2015" 的内容。我不确定这将如何与捆绑到 Types-for-Adobe 中的原始类型进行交互;你可能需要做一些有趣的事情来绕过它们。

(编辑评论:现在是 2021 年,真正的答案应该是 Adob​​e 将 ExtendScript 提升到至少 2011 年的标准......)