问题描述
如何使用 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 的 Adobe Illustrator 构建脚本,并且由于 Adobe 的扩展脚本不具备常见 JS 的所有功能,因此库的作者建议使用 "module": "none","noLib": true
在tsconfig.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 年,真正的答案应该是 Adobe 将 ExtendScript 提升到至少 2011 年的标准......)