tslib icon indicating copy to clipboard operation
tslib copied to clipboard

__spread does not work in IE11

Open nvirth opened this issue 5 years ago • 6 comments

This TypeScript code (a Jasmine test):

describe("array spread operator", function() {
    it('should be able to spread arguments', function() {
        let argumentsArray;
        function testFunction() {
            argumentsArray = [...arguments];
        }
        (testFunction as any)(1, 2, 3);
        expect(argumentsArray).toEqual([1, 2, 3]);
    });
});

runs successfully in browsers but IE. In IE11, it fails with:

Expected $.length = 1 to equal 3.
Expected $[0] = [object Arguments] to equal 1.
Expected $[1] = undefined to equal 2.
Expected $[2] = undefined to equal 3.

I can see the ... array spread operator gets built into a call for helper __spread, thus submitting the issue here.

Browsers I tried:

  • Chrome 76.0.3809.100 64bit
  • Opera 62.0.3331.116
  • Firefox Quantum 68.0.1 64-bit
  • Internet Explorer 11.309.16299.0
  • Microsoft Edge 41.16299.248.0

nvirth avatar Aug 14 '19 09:08 nvirth

@rbuckton any idea what's up?

RyanCavanaugh avatar Aug 21 '19 21:08 RyanCavanaugh

@RyanCavanaugh

IE doesn't support Symbol.Iterator therefore function __read return arguments therefore ar = [].concat(arguments) equals [arguments] e.g., function function f() { return [...arguments] }; f(1); returns [{0: 1}]

imasalygin avatar Sep 02 '19 16:09 imasalygin

We can possibly just change __read to do this:

    __read = function (o, n) {
        var m = typeof Symbol === "function" && o[Symbol.iterator];
        if (!m) return Array.prototype.slice.call(o, 0, n);
        ...

rbuckton avatar Feb 26 '20 02:02 rbuckton

Previously we didn't care about the n argument here since its purpose was to limit how many times we step through the iterator in cases like [a, b] = [1, 2, 3]. It didn't matter when we were just passing through the input object, but if we end up copying it using slice then we should limit the size of the output to cut down on memory usage.

rbuckton avatar Feb 26 '20 02:02 rbuckton

The solution is to polyfill the Symbol.

import 'core-js/features/symbol';

Source: https://www.leereamsnyder.com/blog/new-skool-uniq-in-internet-explorer

anton-bot avatar Jun 22 '20 07:06 anton-bot

We recently updated TSC from 4.1.2 to 4.4.4, where we could see diffing the built JS before and after the TSC upgrade, that lot of __spread usages have been replaced with __spreadArray. After the upgrade, the above initial test case successfully runs in IE11.

nvirth avatar Nov 09 '21 17:11 nvirth