<h2 dir="auto">Bug Report</h2>
<p dir="auto"><strong>Current Behavior</strong><br>
In loose mode, <code class="notranslate">@babel/plugin-proposal-class-properties</code> emits a property assignment for TypeScript definite assignments.</p>
<p dir="auto"><strong>Input Code</strong><br>
<a href="https://babeljs.io/en/repl#?babili=false&amp;browsers=&amp;build=&amp;builtIns=false&amp;spec=false&amp;loose=false&amp;code_lz=PTAEBkEsGsFNQPICMBWsDGAXAdAQwM76QDmAdqEgK6agDukANg6KQPY0FFmgAOATqx6w-mSLHx0AFpHSTQuPvFwNFuACYBPUGtgAzSKVhqAUDvQMF8dK1L4OhEqQAie3JQaZ8ALlCYNQ1l1EVAwcTkdjY3NOUAAxVlZQAG9jUAoFAEIfUkoAWyRhAG5ItOtbTD5KLFY-AApWADdhPkgdb2T0vmy8gr5QAF8ASmTUtPkHMhddNw98WsxpfAAaUEbm1vFB4rT-436gA&amp;debug=false&amp;forceAllTransforms=false&amp;shippedProposals=true&amp;circleciRepo=&amp;evaluate=true&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=false&amp;presets=typescript&amp;prettier=false&amp;targets=Node-8.9&amp;version=7.5.5&amp;externalPlugins=%40babel%2Fplugin-syntax-typescript%407.3.3%2C%40babel%2Fplugin-proposal-class-properties%407.5.5%2C%40babel%2Fplugin-transform-typescript%407.5.5" rel="nofollow">REPL</a> (I'm not sure if it's possible to turn turn on loose mode for the plugin)<br>
<a href="https://www.typescriptlang.org/play/index.html#code/PTAEBkEsGsFNQPICMBWsDGAXAdAQwM76QDmAdqEgK6agDukANg6KQPY0FFmgAOATqx6w+mSLHx0AFpHSTQuPvFwNFuACYBPUGtgAzSKVhqAsACgd6BgvjpWpfB0IlSAET25KDTPgBcoTBpCrLqIqBg4nM5mZpacoABirKygAN5moBQKAIR+pJQAtkjCANzRphm29ph8lFisfAAUrABuwnyQOr6pmXy5BUV8oAC+AJSp6RnyTmRuuh5e+A2Y0vgANKAtbR3iI6Xlw2ZDQA" rel="nofollow">TS Playground</a></p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Like Object.assign but will not assign properties which are already defined
declare const assignDefaults: typeof Object.assign

class Foo {
  bar!: number;

  constructor(overrides: { bar: number }) {
    assignDefaults(this, overrides);
  }
}"><pre class="notranslate"><span class="pl-c">// Like Object.assign but will not assign properties which are already defined</span>
<span class="pl-k">declare</span> <span class="pl-k">const</span> <span class="pl-s1">assignDefaults</span>: <span class="pl-k">typeof</span> <span class="pl-smi">Object</span><span class="pl-kos">.</span><span class="pl-c1">assign</span>

<span class="pl-k">class</span> <span class="pl-smi">Foo</span> <span class="pl-kos">{</span>
  <span class="pl-c1">bar</span><span class="pl-c1">!</span>: <span class="pl-smi">number</span><span class="pl-kos">;</span>

  <span class="pl-en">constructor</span><span class="pl-kos">(</span><span class="pl-s1">overrides</span>: <span class="pl-kos">{</span> <span class="pl-c1">bar</span>: <span class="pl-smi">number</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-en">assignDefaults</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-s1">overrides</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
  <span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto"><strong>Expected behavior/code</strong><br>
A definite assignment should not emit any JS.</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Like Object.assign but will not assign properties which are already defined
class Foo {
  constructor(overrides) {
    assignDefaults(this, overrides);
  }

}"><pre class="notranslate"><span class="pl-c">// Like Object.assign but will not assign properties which are already defined</span>
<span class="pl-k">class</span> <span class="pl-v">Foo</span> <span class="pl-kos">{</span>
  <span class="pl-en">constructor</span><span class="pl-kos">(</span><span class="pl-s1">overrides</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-en">assignDefaults</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-s1">overrides</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
  <span class="pl-kos">}</span>

<span class="pl-kos">}</span></pre></div>
<p dir="auto"><strong>Babel Configuration (.babelrc, package.json, cli command)</strong></p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;presets&quot;: [&quot;@babel/preset-typescript&quot;],
  &quot;plugins&quot;: [[&quot;@babel/plugin-proposal-class-properties&quot;, { &quot;loose&quot;: true }]]
}"><pre class="notranslate">{
  <span class="pl-ent">"presets"</span>: [<span class="pl-s"><span class="pl-pds">"</span>@babel/preset-typescript<span class="pl-pds">"</span></span>],
  <span class="pl-ent">"plugins"</span>: [[<span class="pl-s"><span class="pl-pds">"</span>@babel/plugin-proposal-class-properties<span class="pl-pds">"</span></span>, { <span class="pl-ent">"loose"</span>: <span class="pl-c1">true</span> }]]
}</pre></div>
<p dir="auto"><strong>Environment</strong></p>
<ul dir="auto">
<li>Babel version(s): 7.5.5</li>
<li>Node/npm version: Node 12.6 / yarn 1.15.2</li>
<li>OS: macOS 10.14.5</li>
<li>Monorepo: no</li>
<li>How you are using Babel: cli</li>
</ul>
<p dir="auto"><strong>Additional context/Screenshots</strong><br>
This was previously raised in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="325081166" data-permission-text="Title is private" data-url="https://github.com/babel/babel/issues/7997" data-hovercard-type="issue" data-hovercard-url="/babel/babel/issues/7997/hovercard" href="https://github.com/babel/babel/issues/7997">#7997</a>, but considered expected behavior. It was mentioned that it could be reconsidered for <code class="notranslate">loose</code> mode, however.</p>
<p dir="auto">I do feel like it should be reconsidered one way or another; emitting for these declarations is problematic in the same way emitting for a <code class="notranslate">declare</code> would be. Additionally, this syntax is not valid JS so there the only applicable spec compliance is that of TS.</p>
<h3 dir="auto">Choose one: is this a bug report or feature request?</h3>
<p dir="auto">Bug report.</p>

<h3 dir="auto">Input Code</h3>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="class Text extends TextRecord implements Types.TextNode {
  public readonly firstChild: Types.NestedNode
  public readonly nextSibling: Types.NestedNode
  public readonly type: Types.NodeType.Text
  public readonly uuid: string
  public readonly value: string

  public constructor(props: Types.TextNode) {
    super(props)
  }
}"><pre class="notranslate"><span class="pl-k">class</span> <span class="pl-smi">Text</span> <span class="pl-k">extends</span> <span class="pl-smi">TextRecord</span> <span class="pl-k">implements</span> <span class="pl-smi">Types</span><span class="pl-kos">.</span><span class="pl-smi">TextNode</span> <span class="pl-kos">{</span>
  <span class="pl-k">public</span> <span class="pl-k">readonly</span> <span class="pl-c1">firstChild</span>: <span class="pl-smi">Types</span><span class="pl-kos">.</span><span class="pl-smi">NestedNode</span>
  <span class="pl-k">public</span> <span class="pl-k">readonly</span> <span class="pl-c1">nextSibling</span>: <span class="pl-smi">Types</span><span class="pl-kos">.</span><span class="pl-smi">NestedNode</span>
  <span class="pl-k">public</span> <span class="pl-k">readonly</span> <span class="pl-c1">type</span>: <span class="pl-smi">Types</span><span class="pl-kos">.</span><span class="pl-smi">NodeType</span><span class="pl-kos">.</span><span class="pl-smi">Text</span>
  <span class="pl-k">public</span> <span class="pl-k">readonly</span> <span class="pl-c1">uuid</span>: <span class="pl-smi">string</span>
  <span class="pl-k">public</span> <span class="pl-k">readonly</span> <span class="pl-c1">value</span>: <span class="pl-smi">string</span>

  <span class="pl-k">public</span> <span class="pl-en">constructor</span><span class="pl-kos">(</span><span class="pl-s1">props</span>: <span class="pl-smi">Types</span><span class="pl-kos">.</span><span class="pl-smi">TextNode</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-smi">super</span><span class="pl-kos">(</span><span class="pl-s1">props</span><span class="pl-kos">)</span>
  <span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<h3 dir="auto">Babel/Babylon Configuration (.babelrc, package.json, cli command)</h3>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="module.exports = {
  presets: [
    ['@babel/env', {
      exclude: [
        'transform-async-to-generator',
        'transform-regenerator',
      ],
      targets: {
        browsers: ['last 2 versions'],
      },
      modules: 'commonjs',
      loose: true,
      useBuiltIns: 'usage',
    }],
    '@babel/react',
    ['@babel/stage-0', {
      loose: true,
    }],
    '@babel/typescript',
  ],
  plugins: [
    'autobind-class-methods',
    ['module:fast-async', {
      compiler: {
        lazyThenables: true,
        parser: {
          sourceType: 'module',
        },
        promises: true,
        wrapAwait: true,
      },
      useRuntimeModule: true,
    }],
    'lodash',
    './src/vendor/babel-plugin-ramda',
    'react-loadable/babel',
    'reflective-bind/babel',
    ['styled-components', {
      displayName: true,
      ssr: true,
    }],
    'transform-promise-to-bluebird',
    ['@babel/transform-regenerator', {
      async: false,
      asyncGenerators: true,
      generators: true,
    }],
    '@babel/transform-runtime',
  ],
}"><pre class="notranslate"><span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-c1">exports</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span>
  <span class="pl-c1">presets</span>: <span class="pl-kos">[</span>
    <span class="pl-kos">[</span><span class="pl-s">'@babel/env'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span>
      <span class="pl-c1">exclude</span>: <span class="pl-kos">[</span>
        <span class="pl-s">'transform-async-to-generator'</span><span class="pl-kos">,</span>
        <span class="pl-s">'transform-regenerator'</span><span class="pl-kos">,</span>
      <span class="pl-kos">]</span><span class="pl-kos">,</span>
      <span class="pl-c1">targets</span>: <span class="pl-kos">{</span>
        <span class="pl-c1">browsers</span>: <span class="pl-kos">[</span><span class="pl-s">'last 2 versions'</span><span class="pl-kos">]</span><span class="pl-kos">,</span>
      <span class="pl-kos">}</span><span class="pl-kos">,</span>
      <span class="pl-c1">modules</span>: <span class="pl-s">'commonjs'</span><span class="pl-kos">,</span>
      <span class="pl-c1">loose</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
      <span class="pl-c1">useBuiltIns</span>: <span class="pl-s">'usage'</span><span class="pl-kos">,</span>
    <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">,</span>
    <span class="pl-s">'@babel/react'</span><span class="pl-kos">,</span>
    <span class="pl-kos">[</span><span class="pl-s">'@babel/stage-0'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span>
      <span class="pl-c1">loose</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
    <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">,</span>
    <span class="pl-s">'@babel/typescript'</span><span class="pl-kos">,</span>
  <span class="pl-kos">]</span><span class="pl-kos">,</span>
  <span class="pl-c1">plugins</span>: <span class="pl-kos">[</span>
    <span class="pl-s">'autobind-class-methods'</span><span class="pl-kos">,</span>
    <span class="pl-kos">[</span><span class="pl-s">'module:fast-async'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span>
      <span class="pl-c1">compiler</span>: <span class="pl-kos">{</span>
        <span class="pl-c1">lazyThenables</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
        <span class="pl-c1">parser</span>: <span class="pl-kos">{</span>
          <span class="pl-c1">sourceType</span>: <span class="pl-s">'module'</span><span class="pl-kos">,</span>
        <span class="pl-kos">}</span><span class="pl-kos">,</span>
        <span class="pl-c1">promises</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
        <span class="pl-c1">wrapAwait</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
      <span class="pl-kos">}</span><span class="pl-kos">,</span>
      <span class="pl-c1">useRuntimeModule</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
    <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">,</span>
    <span class="pl-s">'lodash'</span><span class="pl-kos">,</span>
    <span class="pl-s">'./src/vendor/babel-plugin-ramda'</span><span class="pl-kos">,</span>
    <span class="pl-s">'react-loadable/babel'</span><span class="pl-kos">,</span>
    <span class="pl-s">'reflective-bind/babel'</span><span class="pl-kos">,</span>
    <span class="pl-kos">[</span><span class="pl-s">'styled-components'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span>
      <span class="pl-c1">displayName</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
      <span class="pl-c1">ssr</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
    <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">,</span>
    <span class="pl-s">'transform-promise-to-bluebird'</span><span class="pl-kos">,</span>
    <span class="pl-kos">[</span><span class="pl-s">'@babel/transform-regenerator'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span>
      <span class="pl-c1">async</span>: <span class="pl-c1">false</span><span class="pl-kos">,</span>
      <span class="pl-c1">asyncGenerators</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
      <span class="pl-c1">generators</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
    <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">,</span>
    <span class="pl-s">'@babel/transform-runtime'</span><span class="pl-kos">,</span>
  <span class="pl-kos">]</span><span class="pl-kos">,</span>
<span class="pl-kos">}</span></pre></div>
<h3 dir="auto">Expected Behavior</h3>
<p dir="auto">Babel should strip the type annotations from the class altogether, à la TypeScript's transpiled code:</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="var Text = /** @class */ (function (_super) {
    __extends(Text, _super);
    function Text(props) {
        return _super.call(this, props) || this;
    }
    return Text;
}(TextRecord));"><pre class="notranslate"><span class="pl-k">var</span> <span class="pl-v">Text</span> <span class="pl-c1">=</span> <span class="pl-c">/** <span class="pl-k">@class</span> */</span> <span class="pl-kos">(</span><span class="pl-k">function</span> <span class="pl-kos">(</span><span class="pl-s1">_super</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-en">__extends</span><span class="pl-kos">(</span><span class="pl-v">Text</span><span class="pl-kos">,</span> <span class="pl-s1">_super</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-k">function</span> <span class="pl-v">Text</span><span class="pl-kos">(</span><span class="pl-s1">props</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
        <span class="pl-k">return</span> <span class="pl-s1">_super</span><span class="pl-kos">.</span><span class="pl-en">call</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-s1">props</span><span class="pl-kos">)</span> <span class="pl-c1">||</span> <span class="pl-smi">this</span><span class="pl-kos">;</span>
    <span class="pl-kos">}</span>
    <span class="pl-k">return</span> <span class="pl-v">Text</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span><span class="pl-kos">(</span><span class="pl-v">TextRecord</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<h3 dir="auto">Current Behavior</h3>
<p dir="auto">Babel adds code to the constructor assigning <code class="notranslate">void 0</code> to the annotated class properties:</p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="var Text =
/*#__PURE__*/
function (_TextRecord) {
  (0, _inheritsLoose2.default)(Text, _TextRecord);

  function Text(props) {
    var _this12;

    _this12 = _TextRecord.call(this, props) || this;
    _this12.firstChild = void 0;
    _this12.nextSibling = void 0;
    _this12.type = void 0;
    _this12.uuid = void 0;
    _this12.value = void 0;
    return _this12;
  }

  return Text;
}(TextRecord);"><pre class="notranslate"><span class="pl-k">var</span> <span class="pl-v">Text</span> <span class="pl-c1">=</span>
<span class="pl-c">/*#__PURE__*/</span>
<span class="pl-k">function</span> <span class="pl-kos">(</span><span class="pl-s1">_TextRecord</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
  <span class="pl-kos">(</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-s1">_inheritsLoose2</span><span class="pl-kos">.</span><span class="pl-c1">default</span><span class="pl-kos">)</span><span class="pl-kos">(</span><span class="pl-v">Text</span><span class="pl-kos">,</span> <span class="pl-s1">_TextRecord</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

  <span class="pl-k">function</span> <span class="pl-v">Text</span><span class="pl-kos">(</span><span class="pl-s1">props</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-k">var</span> <span class="pl-s1">_this12</span><span class="pl-kos">;</span>

    <span class="pl-s1">_this12</span> <span class="pl-c1">=</span> <span class="pl-s1">_TextRecord</span><span class="pl-kos">.</span><span class="pl-en">call</span><span class="pl-kos">(</span><span class="pl-smi">this</span><span class="pl-kos">,</span> <span class="pl-s1">props</span><span class="pl-kos">)</span> <span class="pl-c1">||</span> <span class="pl-smi">this</span><span class="pl-kos">;</span>
    <span class="pl-s1">_this12</span><span class="pl-kos">.</span><span class="pl-c1">firstChild</span> <span class="pl-c1">=</span> <span class="pl-k">void</span> <span class="pl-c1">0</span><span class="pl-kos">;</span>
    <span class="pl-s1">_this12</span><span class="pl-kos">.</span><span class="pl-c1">nextSibling</span> <span class="pl-c1">=</span> <span class="pl-k">void</span> <span class="pl-c1">0</span><span class="pl-kos">;</span>
    <span class="pl-s1">_this12</span><span class="pl-kos">.</span><span class="pl-c1">type</span> <span class="pl-c1">=</span> <span class="pl-k">void</span> <span class="pl-c1">0</span><span class="pl-kos">;</span>
    <span class="pl-s1">_this12</span><span class="pl-kos">.</span><span class="pl-c1">uuid</span> <span class="pl-c1">=</span> <span class="pl-k">void</span> <span class="pl-c1">0</span><span class="pl-kos">;</span>
    <span class="pl-s1">_this12</span><span class="pl-kos">.</span><span class="pl-c1">value</span> <span class="pl-c1">=</span> <span class="pl-k">void</span> <span class="pl-c1">0</span><span class="pl-kos">;</span>
    <span class="pl-k">return</span> <span class="pl-s1">_this12</span><span class="pl-kos">;</span>
  <span class="pl-kos">}</span>

  <span class="pl-k">return</span> <span class="pl-v">Text</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span><span class="pl-kos">(</span><span class="pl-v">TextRecord</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<h3 dir="auto">Possible Solution</h3>
<p dir="auto">It would be great if either the TypeScript transform specifically stripped annotation-only class properties or the class properties transform generally didn't add assignments for properties that aren't defined.</p>
<h3 dir="auto">Context</h3>
<p dir="auto">It's a common pattern when using Immutable.js with TypeScript to thread strong typings through Immutable Records by creating classes that extend the records and add type annotations to their properties. This works with the TypeScript compiler because TypeScript completely strips the type annotations from the class properties; however, it breaks with Babel because after the <code class="notranslate">super</code> call Babel is effectively attempting to set new properties on an Immutable Record, which throws a runtime error:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="saga.ts:89 Error: Cannot set on an immutable record.
    at invariant (immutable.es.js:1873)
    at Text.set (immutable.es.js:5550)
    at new Text (records.ts:251)
    at Array.postReviver (lib.ts:33)
    at fromJSWith (immutable.es.js:5682)
    at immutable.es.js:5685
    at immutable.es.js:1222
    at ArraySeq.__iterate (immutable.es.js:432)
    at IndexedCollection.mappedSequence.__iterateUncached (immutable.es.js:1221)
    at IndexedCollection.__iterate (immutable.es.js:302)
    at IndexedCollection.toArray (immutable.es.js:4575)
    at List (immutable.es.js:3064)
    at IndexedCollection.toList (immutable.es.js:4633)
    at Object.postReviver (lib.ts:39)
    at fromJSWith (immutable.es.js:5682)
    at immutable.es.js:5685"><pre class="notranslate"><code class="notranslate">saga.ts:89 Error: Cannot set on an immutable record.
    at invariant (immutable.es.js:1873)
    at Text.set (immutable.es.js:5550)
    at new Text (records.ts:251)
    at Array.postReviver (lib.ts:33)
    at fromJSWith (immutable.es.js:5682)
    at immutable.es.js:5685
    at immutable.es.js:1222
    at ArraySeq.__iterate (immutable.es.js:432)
    at IndexedCollection.mappedSequence.__iterateUncached (immutable.es.js:1221)
    at IndexedCollection.__iterate (immutable.es.js:302)
    at IndexedCollection.toArray (immutable.es.js:4575)
    at List (immutable.es.js:3064)
    at IndexedCollection.toList (immutable.es.js:4633)
    at Object.postReviver (lib.ts:39)
    at fromJSWith (immutable.es.js:5682)
    at immutable.es.js:5685
</code></pre></div>
<p dir="auto">I know it's a bit of a corner case, but it's making it pretty challenging to enjoy the benefits of TypeScript with Immutable.</p>
<h3 dir="auto">Your Environment</h3>

<table role="table">
<thead>
<tr>
<th>software</th>
<th>version(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Babel</td>
<td><code class="notranslate">v7.0.0-beta.42</code></td>
</tr>
<tr>
<td>Babylon</td>
<td>N/A</td>
</tr>
<tr>
<td>node</td>
<td><code class="notranslate">v9.8.0</code></td>
</tr>
<tr>
<td>npm</td>
<td><code class="notranslate">v5.7.1</code></td>
</tr>
<tr>
<td>Operating System</td>
<td>macOS 10.13.4</td>
</tr>
</tbody>
</table>