Failed to parse module: Reserved keyword 'interface' encountered
P粉841870942
P粉841870942 2024-03-21 18:29:51
0
1
350

I'm trying to write a common component rd-component that contains some common pages that are used across all projects. When I import this public page it shows error:

Module parse failed: The keyword 'interface' is reserved (15:0)

I made a minimal reproducible example, which is a simple component using a public page:

import './App.css';
import React from 'react';
import Goods from "rd-component/src/component/good/Goods";

const Chat: React.FC = (props) => {

  return (<Goods></Goods>);
}

export default Chat;

This is Index.tsx:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './index.css';
import reportWebVitals from './reportWebVitals';
import Chat from './App';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <Chat />
  </React.StrictMode>
);


reportWebVitals();

This is my package.json containing all packages:

{
  "name": "react-demo",
  "version": "0.1.0",
  "private": true,
  "config-overrides-path": "src/config/config-overrides.js",
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "@textea/json-viewer": "^2.16.2",
    "@types/jest": "^27.5.2",
    "@types/node": "^16.18.21",
    "@types/react": "^18.0.30",
    "@types/react-dom": "^18.0.11",
    "antd": "^5.4.0",
    "prismjs": "^1.29.0",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1",
    "react-syntax-highlighter": "^15.5.0",
    "typescript": "^4.9.5",
    "web-vitals": "^2.1.4",
    "rd-component": "0.1.1"
  },
  "scripts": {
    "start": "react-app-rewired start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@types/react-syntax-highlighter": "^15.5.6",
    "customize-cra": "^1.0.0",
    "react-app-rewired": "^2.2.1"
  }
}

This is the complete error output when running the command npm run build:

> react-demo@0.1.0 build
> react-scripts build

Creating an optimized production build...
Failed to compile.

Module parse failed: The keyword 'interface' is reserved (15:0)
File was processed with these loaders:
 * ./node_modules/source-map-loader/dist/cjs.js
You may need an additional loader to handle the result of these loaders.
| import { doPay } from "@/service/pay/PayService";
| 
> interface IGoodsProp {
|   appId: string;
| }

P粉841870942
P粉841870942

reply all(1)
P粉031492081

By default, TypeScript (or possibly create-react-app, if you are using that) does not compile modules from node_modules.

This appears to be the case with your Goods component:

import Goods from "rd-component/src/component/good/Goods";
{
  "dependencies": {
    // ...
    "rd-component": "0.1.1"
  }
}

The default configuration assumes that everything in node_modules is ready for use by pure JavaScript projects.

Therefore, library components written in TypeScript are expected to be converted to JavaScript.

That being said, there is still a simple workaround you can try, which involves adding a symlink to the TypeScript file of the library source in your project src.

IIRC, unfortunately some build engines are "too" smart and can even see the actual paths via symlinks... in which case you have to manually include the library in the compilation scope.

Of course, the correct solution is to precompile your library.

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template