title: React/Typescript /VScode - an import path cannot end with a '.tsx' extension
body: <p>I have a series of react projects which I have converted to typescript. Some of these use webpack, and some of them just use babel as they're libraries which are consumed by the other (webpack) projects/actual applications.</p>
  
  <p>I've converted everything to typescript without problems, except in one non-webpack project, where I receive the error 'an import path cannot end with a .tsx extension', for example on</p>
  
  <pre><code>import LoadingLogo from '../ui/LoadingLogo.tsx';
  
  </code></pre>
  
  <p>I can get round this by omitting the extension, or using // @ts-ignore, but neither of these are optimal solutions, since the project will be a mix of jsx and tsx while it is being refactored and I'd like to be able to see at a glance which file type is being used in the import.</p>
  
  <p>The steps I've taken to convert the project to typescript are</p>
  
  <ol>
  <li>Install typescript </li>
  <li>Install @babel/preset-typescript </li>
  <li>add </li>
  </ol>
  
  <pre><code>presets: [ @babel/preset-typescript ]
  </code></pre>
  
  <p>to my babel.config.js</p>
  
  <p>To make matters even more confusing, in one of the other (non-webpack) apps, I've got the same babel setup running and I'm not seeing this issue. Is there something obvious I'm missing? For reference, my babel.config in the project with the issue looks like this </p>
  
  <pre><code>module.exports = function(api) {
    api.cache(true);
  
    return {
      ignore: ['node_modules/**/*'],
      presets: [
        ['@babel/preset-typescript'],
        [
          '@babel/preset-env',
          {
            loose: true,
            targets: {
              node: 'current'
            }
          }
        ],
        '@babel/preset-react'
      ],
      env: {
        translations: {
          plugins: [
            'syntax-async-functions',
            '@babel/plugin-syntax-dynamic-import',
            'dynamic-import-node',
            [
              'react-intl',
              {
                messagesDir: './messages',
                enforceDescriptions: false
              }
            ]
          ]
        },
        production: {
          plugins: [
            'jsx-strip-ext',
            [
              'babel-plugin-styled-components',
              {
                ssr: true
              }
            ],
            'syntax-async-functions',
            '@babel/plugin-syntax-dynamic-import',
            'dynamic-import-node'
          ]
        },
        development: {
          plugins: [
            [
              'babel-plugin-styled-components',
              {
                ssr: true
              }
            ],
            'syntax-async-functions',
            '@babel/plugin-syntax-dynamic-import',
            'dynamic-import-node'
          ]
        }
      },
      plugins: [
        '@babel/plugin-transform-runtime',
        '@babel/plugin-syntax-dynamic-import',
        '@babel/plugin-syntax-import-meta',
        '@babel/plugin-proposal-class-properties',
        '@babel/plugin-proposal-json-strings',
        '@babel/plugin-transform-classes'
      ]
    };
  };
  </code></pre>
  
  <p>and my babel config in the non-webpack project without the issue looks like this </p>
  
  <pre><code>module.exports = function(api) {
    api.cache(true);
  
    return {
      presets: ['@babel/preset-typescript'],
      ignore: ['node_modules/**/*'],
      extends: 'myProject/babel.config.js',
      env: {
        production: {
          plugins: [
            [
              'module-resolver',
              {
                alias: {
                  '^myProject/src/(.+)': 'myProject/lib/\\1'
                },
                extensions: ['.js', '.jsx'],
                stripExtensions: ['.js', '.jsx']
              }
            ],
            [
              'babel-plugin-styled-components',
              {
                ssr: true
              }
            ],
            'syntax-async-functions',
            '@babel/plugin-syntax-dynamic-import',
            'dynamic-import-node'
          ]
        },
        development: {
          plugins: [
            [
              'babel-plugin-styled-components',
              {
                ssr: true
              }
            ],
            'syntax-async-functions',
            '@babel/plugin-syntax-dynamic-import',
            'dynamic-import-node'
          ]
        }
      }
    };
  };
  
  </code></pre>
  
  <p>tsconfig.json for both projects looks like this </p>
  
  <pre><code>{
    "compilerOptions": {
      "module": "esnext",
      "outDir": "dist/",
      "noImplicitAny": true,
      "removeComments": true,
      "preserveConstEnums": true,
      "sourceMap": true,
      "target": "ESNext",
      "allowJs": true,
      "checkJs": false,
      "jsx": "react",
      "pretty": true,
      "skipLibCheck": true,
      "strict": true,
      "moduleResolution": "node",
      "esModuleInterop": true,
      "lib": ["dom", "dom.iterable", "ESNext"],
      "allowSyntheticDefaultImports": true,
      "forceConsistentCasingInFileNames": true,
      "resolveJsonModule": true,
      "isolatedModules": true
    },
    "include": ["src"],
    "exclude": ["node_modules", "**/*.spec.ts"]
  }
  </code></pre>
  
  <p>My first instinct was to look at the module resolver plugin, but that didn't seem to make any difference. Is there something obvious I'm missing?</p>