TypeScript v4.2.3中的将对象扩展到数组中的破坏性更改

5vf7fwbs  于 2022-10-29  发布在  TypeScript
关注(0)|答案(1)|浏览(169)

错误报告

我们注意到从4.1.5升级到4.2.3时我们的应用程序发生了重大变化。我们的ts配置。注意。我认为这可能与downlevelIteration”有关:真的
我知道这可能是无效的代码(当我在节点中运行它时,它只是出错了),但typescript允许这样做,我想报告它只是以防万一,如果这是一个问题。如果你认为这是预期的行为,请随时关闭。

{
  "compilerOptions": {
    "target": "es5",
    "downlevelIteration": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "react",
    "esModuleInterop": true,
    "sourceMap": true,
    "noImplicitAny": true,
    "resolveJsonModule": true
  }
}

🔎检索词

将对象向下扩展到数组中迭代

🕗版本和回归信息

4.2.3

  • 这是意外行为
  • 这在版本4.1.5和4.2.3之间进行了更改

Playground链接

带有相关代码的Playground链接

💻代码

let arr = []

let testObj: any = { a: 'a', b: 'b' }

arr = [...testObj]

console.log(arr)

🙁实际行为

返回

[]

🙂预期行为

返回

[{
  "a": "a",
  "b": "b"
}]
z5btuh9x

z5btuh9x1#

testObj是不可迭代的。大多数JavaScript引擎在这种情况下都会抛出错误 jsfiddle
chrome/v8
未捕获的类型错误:B不可迭代
safari/JavaScriptCore
TypeError:Spread语法要求...可迭代的[Symbol.iterator]是函数
babelesbuild也抛出错误。TypeScript忽略错误并发出空[]

"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
var a = [];
var b = { a: 'a', b: 'b' };
a = __spreadArray([], __read(b));

__read返回b,因为它没有Symbol.iterator。所以__spreadArray接受一个没有.length属性的对象,并返回一个空数组to
TypeScript帮助器是否应处理此情况并引发Error
/抄送:瑞安·卡瓦诺@rbuckton

相关问题