【发布时间】:2020-08-18 01:04:05
【问题描述】:
更新:
此时,在我运行后,我无法再在本地复制它
rm -rf node_mdoules/ && npm i
我会保留这个问题,因为它可能对遇到此错误的其他人有用。在撰写本文时,该错误仍然可以在 jsfiddle 中重现。
如果有人找到了可靠地复制它的方法,请提供一个 repo,因为我知道一些充满热情的编码人员好奇地寻找其根本原因。
初始问题
我有这个 JavaScript 代码,它可以工作:
const iconsMap = new Map([
['Roofs', 'roofs'],
['Walls', 'walls'],
['Windows & Doors', 'doors'],
['Heating & Controls', 'heating'],
['Ventilation & Air Tightness', 'ventilation'],
['Renewables', 'renewables'],
['Others', 'others'],
['Default', 'home'],
]);
console.log(
Object.assign({}, ...Array.from(iconsMap).map(([label, fileName]) => ({[label]: fileName})))
);
我的第一次 Typescript 尝试非常接近原始 JS:
const iconsMap: Map<string, string> = new Map([
['Roofs', 'roofs'],
['Walls', 'walls'],
['Windows & Doors', 'doors'],
['Heating & Controls', 'heating'],
['Ventilation & Air Tightness', 'ventilation'],
['Renewables', 'renewables'],
['Others', 'others'],
['Default', 'home'],
]);
interface Dictionary<T> {
[key: string]: T;
}
console.log(
Object.assign(
{} as Dictionary<string>,
...Array.from(iconsMap).map(
([label, fileName]) => ({ [label]: fileName })
)
)
);
但它打破了:
VM325:13 Uncaught SyntaxError: Unexpected token '(' 在新函数 () 在 exec (VM319 typescript.js:41)
由于某种原因,箭头函数() => ({}) 的隐含return 在此处失败。我需要做() => { return {}; }。所以这行得通:
console.log(
Object.assign(
{} as Dictionary<string>,
...Array.from(iconsMap).map(([label, fileName]) => {
return { [label]: fileName };
})
)
);
谁能解释一下原因?
注意:我对重写上述代码的替代方法不感兴趣(实际上是断章取义以突出问题)。我已经重写了整个内容,我正在使用.reduce(),我对此感到非常满意。
对于好奇的类型... cript,实际实现:
export const iconRegistry: Dictionary<string> = Array.from(iconsMap)
.reduce((o, [label, fileName]) => ({
...o,
[label]: require(`./assets/icons/measure/${fileName}.svg`)
}), {} as Dictionary<string>);
但我想了解为什么上面隐含的 return 会失败。
感谢您抽出宝贵时间。
【问题讨论】:
-
typescript.js(大概是它的编译结果?)包含什么?
-
看起来像这样:
console.log(Object.assign({}, ...Array.from(iconsMap).map(function ([label, fileName]) ({ [label]: fileName }))));。这是a fiddle。 -
(另外,你使用的是哪个版本的Node,你确定TypeScript编译步骤成功了吗?TypeScript成功编译成语法无效的JavaScript会很奇怪。)
-
您能否确保您使用的是最新版本的 TypeScript 编译器,并升级到受支持的 Node (14) 版本?
-
我发现 TypeScript JSFiddle 使用的版本是:1.7.3,相当过时(仍然不是我期望的稳定版本的那种错误,但是……)。您是在调用 tsc(就像您尝试过
tsc --version一样)进行编译,还是通过其他工具进行编译?
标签: javascript typescript arrow-functions