问题标签 [ecmascript-2020]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 一次检查大量变量的真实性
我有一个包含许多字段和一个特殊处理函数的大型表单在
函数开头声明了几个不同类型的变量
我想检查用户是否在函数执行之前设置了所有变量
我想抓住a5
,因为它是一个空字符串
如果我们有 5 个以上的变量并且不是很优雅,则变体 1 不可读
变体 2 更加优雅和清晰,但不适用于非布尔类型的变量
如何一次检查大量变量?
javascript - 为什么 undefined?.fun() 不抛出错误?
在 Node 14.18.0 中看到以下行为,我感到非常惊讶:
我明白为什么第一条语句会引发 TypeError。{}?.fun
is undefined
,这是不可调用的。但是undefined?.fun
is 也是undefined
,那为什么不抛出就可以调用呢?ECMAScript 规范的哪一部分定义了这种行为?ECMAScript 工作组是否提供了为什么它应该以这种方式工作的任何理由?
node.js - 在导出 ESModules 的 Typescript 项目中导入 CommonJS 模块
我正在 Typescript 中制作 NodeJs 库,并计划使其支持 Node@14+。因此,我决定将这个项目作为 ESModule 而不是 CommonJs。现在需要一些 CommonJs 库,我正在安装它们的@types
. 我的打字稿文件的导入如下所示:
tsconfig.json
看起来像这样:
如您所见,我的目标是 ES2020,因为 Node@14+ 完全支持它,并且我的配置基于此处令人难以置信的答案https://stackoverflow.com/a/61305579/5863472。另外,我正在设置"type": "module"
我的package.json
.
这构建没有问题,但不运行。Node抛出的错误是
从'fs-extra'导入{copySync,readdirSync,readFile,readFileSync,writeFile};
^^^^^^^^
语法错误:未找到命名导出“readFile”。请求的模块“fs-extra”是一个 CommonJS 模块,它可能不支持所有 module.exports 作为命名导出。
CommonJS 模块总是可以通过默认导出导入,例如使用:
从“fs-extra”导入 pkg;
常量 { copySync,readdirSync,readFile,readFileSync,writeFile } = pkg;
"module": "ES2020"
相同的代码库在 my 中使用tsconfig.json
并删除 my 中的type
密钥可以很好地编译package.json
。
我发现解决此问题的方法是遵循错误消息。这工作正常:
但这感觉像是一种痛苦,并且似乎可以被工具化。我是否缺少编译选项或可以自动转换import { foo } from 'bar'
为import bar from 'bar'; const { foo } = bar
.
PS 我真的不想使用 Babel ......
typescript - 是否应该重用从动态导入返回的承诺,而不是再次调用 import()?
我可能想多了,但我试图找出其中哪些是首选:
或者
javascript - 当没有方法的返回值时,为什么 javaScript 的可选链接语法不适用于 Nullish Coalescing Operator?
我正在尝试新的 JavaScript 可选链接语法,它似乎与没有返回值的方法有问题。例如:
我有一个带有 order 方法的餐厅对象:
现在,如果我尝试检查以下餐厅对象中是否存在 order 方法,它会返回“undefiend”:
现在的问题是,如果我将上述情况与 Nullish Coalescing Operator 一起使用,如下所示,它不起作用:
ISSUE:现在上述语句中的问题是,可选的链接语法甚至可以找到 order 方法并打印“I was here with 0 and 1”但仍然返回“undefiend”,这使得 Nullish Coalescing Operator 继续进行,甚至打印“Method does不存在'也作为默认值?
现在,如果我允许 order 方法返回一个值,那么它可以与 Nullish Coalescing Operator 一起正常工作并且它不会继续。
如果再次检查:
可选链接语法是否有必要从方法中期望返回值而不是空值以检查其可用性?
在上述情况下,order 方法确实存在,那么如何防止 Nullish Coalescing Operator 不继续默认的“方法不存在”?
我正在使用现代浏览器(Chrome 和 firfox)对其进行测试,并且我还在 Chrome 中启用了 javaScript 实验性功能,但它仍然以上述方式工作。
有什么想法会有所帮助吗?谢谢
typescript - 如何在使用 Puppeteer 时录制音频?
背景
我正在制作录制流媒体研讨会音频的软件。尽管我以用户身份自动进入研讨会,但我还没有找到录制其音频的方法。
该怎么办
我知道有很多工具可以自动执行浏览任务。其中,我选择了使用 Puppeteer 并且知道如何在通过 Puppeteer 浏览的同时进行记录。
假设给你一个page
Puppeteer。您需要录制其页面的音频。我的脚本是用 TypeScript 编写的,因此非常感谢您用 TypeScript 编写答案!当然,JavaScript 当然是受欢迎的!
我做了什么
我搜索了一个解决方案,发现了一些似乎相关的东西,但是这个脚本在我的环境中不起作用(ES2020)。
javascript - 如何仅将对象属性子集的值复制到 TypeScript 中的另一个现有对象
假设我有一个现有的对象obj1 = {a: 'A', b: 'B', c: 'C', d: 'D'}
我有另一个对象,例如obj2 = {b: 'B2', c: 'C2', d: 'D2', e: 'E2'}
现在我想有选择地将只有几个属性的值从 复制obj2
到obj1
,对于 中的其余属性obj1
,我希望它们保持不变。
现在,假设我想复制 propertiesb
和d
. 我想做类似的事情
这个方法怎么写?请注意,我也不想将属性列表作为字符串提供,因为我希望尽可能保证编译时安全。
所以这里的基本问题是:
- 仅从对象复制几个属性值
- 复制到现有对象而不创建新对象
- 在目标对象中保留其他属性值
- 避免使用字符串作为属性名称(如)并尽可能
'b', 'd'
利用安全性TypeScript
基于评论的澄清:
当我obj2.b
在(伪)代码示例中说左右时
- 我不是字面意思
obj2.b
- 而是在编译时检查
b
实际上是obj2
's 类型的属性的某种方法
javascript - 在 node.js 应用程序中以调试模式 (VSCode) 使用可选链接 (ES2020) 时出现语法错误
我收到“未捕获的语法错误:意外的令牌”。如果我的代码包含可选链接 (?.),则当我尝试在 VSCode (F5) 的调试模式下使用我的 express 应用程序时出现消息。当我使用运行正常的命令“npm start”的应用程序时,我没有这个问题。我没有使用非常具体的配置(编译器、打火机......)构建项目的经验,这个项目是使用 npm init 创建的。
您可以在下面看到我认为对解决问题有用的详细信息。需要帮助请叫我。如果它包含可选的链接语法,我是否可以调试应用程序?我应该更新任何版本吗?我应该更改任何配置文件吗?
详细信息:
节点 v16.10.0
npm v7.24.0
包.json
启动.json
javascript - 未找到命名导出“类型”。请求的模块 'mongoose' 是一个 CommonJS 模块,它可能不支持所有 module.exports 作为命名导出
我"module": "es2020"
在其 tsconfig 中有一个用 typescript 编写的快速服务器。
我还es2020
为我的 graphql API 开发了另一个模块,仍然在 typescript 中,并且该模块使用带有此类命名导入的 mongoose:
当我使用tsc
. 但是运行的快递服务器
nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
无法处理名为 import 的猫鼬。
解决方案#1
并替换Types
为mongoose.Types
.
但既然tsc
可以处理名为 import 的 mongoose,我希望它也可以让 ts-node 能够这样做。
解决方案#2
切换到commonjs
,我可以在我的 graphql 模块中保留导入/导出语法并将其编译为 cjs 模块。但是我必须在我的快速服务器中使用 cjs 语法,我不想这样做。
javascript - Angular 应用:从 es2015 迁移到 es2020
我刚刚将我的应用程序更新到 Angular 12 并尝试使用 es2020。出于某种原因,当我的应用程序构建时,我仍然遇到错误,因为该应用程序似乎仍在尝试使用 es2015:
我已经更新tsconfig.json
以反映 es2020:
编辑:
当我提供我的应用程序时,我还会看到以下内容:
最后,我已经在我的package.json
.
但是自从进行更改后,我没有明确安装任何新类型。接下来我该怎么做才能允许更改为 es2020?