Ant*_*ash 6 typescript typescript4.0
我有以下输入:
\nimport {onMediaChangeSubscribe} from \'../functions/doOnMediaChange\'\n\nexport class ActionButton extends ElementBase {\n mount(){\n onMediaChangeSubscribe(this.render)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nTypescript 4.3.x 的输出是:
\ndoOnMediaChange_1.onMediaChangeSubscribe(this.render);\nRun Code Online (Sandbox Code Playgroud)\nTypescript 4.4.x 执行以下操作:
\n(0, doOnMediaChange_1.onMediaChangeSubscribe)(this.render);\nRun Code Online (Sandbox Code Playgroud)\nW\xcc\xb6h\xcc\xb6a\xcc\xb6t\xcc\xb6 \xcc\xb6t\xcc\xb6h\xcc\xb6e\xcc\xb6 \xcc\xb6h\xcc\xb6a\xcc\xb6c\xcc\xb6k\ xcc\xb6?\xcc\xb6?\xcc\xb6?\xcc\xb6\n我的问题在这里部分得到解答:JavaScript 语法 (0, fn)(args),但我想澄清一下。
\n为什么 TypeScript 会有这样的变化?
\n最小复制示例:
\na.ts
export function doTheThing(){}\nRun Code Online (Sandbox Code Playgroud)\nb.ts
import {doTheThing} from \'./a\'\n\ndoTheThing()\nRun Code Online (Sandbox Code Playgroud)\nb.ts 编译为:
\n"use strict";\nObject.defineProperty(exports, "__esModule", { value: true });\nvar a_1 = require("./a");\n(0, a_1.doTheThing)();\nRun Code Online (Sandbox Code Playgroud)\n用过的tsconfig.json:
{\n "compilerOptions": {\n "module": "commonjs",\n "target": "es5",\n "sourceMap": true,\n "declaration": true,\n "strict": true,\n "noImplicitAny": false,\n "esModuleInterop": true,\n "resolveJsonModule": true,\n "downlevelIteration": true\n },\n "exclude": [\n "node_modules"\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n
jca*_*alz 13
此更改作为microsoft/TypeScript#35420的修复在microsoft/TypeScript#44624中实现,并随 TypeScript 4.4 一起发布。(请注意,早期曾在microsoft/TypeScript#35877进行过修复尝试,但在发布之前已在microsoft/TypeScript#43993中恢复。)
正如另一个问题foo.bar()的答案所解释的,和之间的区别在于前者的上下文是(0, foo.bar)(),而后者的上下文是(在严格模式下,或在草率模式下的全局对象)。 视为的方法,而视为与无关的函数。thisfooundefinedfoo.bar()barfoo(0, foo.bar)()barfoo
根据 TypeScript 的模块 target,发出的 Javascript 会将导入的内容放入对象中,因此
import {onMediaChangeSubscribe} from '../functions/doOnMediaChange'
Run Code Online (Sandbox Code Playgroud)
可以发射为
const doOnMediaChange_1 = require("../functions/doOnMediaChange")
Run Code Online (Sandbox Code Playgroud)
然后任何对的引用都onMediaChangeSubscribe需要作为 发出 doOnMediaChange_1.onMediaChangeSubscribe。
当您调用导入的函数时,您希望它像函数一样运行,而不是您要导入的模块的“方法”。好吧,很多时候没有区别,但如果导入函数的主体碰巧引用了this,您确实希望它this是undefined而不是doOnMediaChange_1,否则它将不等同于本机模块的行为。
这本质上是 microsoft/TypeScript#35420 中的问题。解决方法是使用逗号运算符普遍包装对导入函数的调用,如您所见。
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |