Búsqueda de sitios web

node.js - Errores de Node/Typescript/tslint en el operador de encadenamiento opcional (?.) en la carpeta node_modules


Tengo un script de Node que funciona bien en la versión de Node hasta la 17:

nvm use 17
Now using node v17.9.1 (npm v8.11.0)
cd src
npx tsc
npx node parser.js
cd ..

A partir de la versión 18 de Node, produce un error porque @npmcli está usando un operador de encadenamiento opcional:

nvm use 18
Now using node v18.16.0 (npm v9.5.1)
cd src
npx tsc
/Users/mles/.nvm/versions/node/v18.16.0/lib/node_modules/npm/node_modules/@npmcli/config/lib/index.js:485
        const raw = this.data.get(problem.where).raw?.[problem.from]
                                                     ^

SyntaxError: Unexpected token '.'

Obtengo un error similar en las versiones de node 19, 20 y 21. Supongo que tiene que ver con mi configuración de TypeScript o TSLint, que no le gusta ningún operador de encadenamiento opcional. He intentado ignorar cualquier carpeta node_modules en mi archivo tslint.json, pero no resuelve el problema:

{
  "defaultSeverity": "error",
  "extends": [
    "tslint:recommended"
  ],
  "jsRules": {},
  "rules": {
    "no-console": false,
    "object-literal-sort-keys": [
      true,
      "match-declaration-order"
    ],
    "max-line-length": [
      true,
      200
    ],
    "typedef": [
      true,
      "member-variable-declaration",
      "variable-declaration"
    ]
  },
  "rulesDirectory": [],
  "compilerOptions": {
    "skipLibCheck": true
  },
  "linterOptions": {
    "exclude": [
        "node_modules"
    ]
  }
}

Mi archivo tsconfig.json:

{
  "compilerOptions": {
    "target": "ESNEXT",             
    "module": "commonjs",           
    "strict": true,                 
    "esModuleInterop": true,        
    "sourceMap": true
  }
}

¿Alguna pista sobre cómo permitir el operador de encadenamiento opcional en mi configuración?

Respuesta #1

Puedes actualizar tus compilerOptions para incluir las reglas específicas para encadenamiento opcional. Esto te permitirá mantener el modo estricto activado y seguir validando las dependencias.

Tus compilerOptions se verían así:

{
  "compilerOptions": {
    "target": "ESNEXT",             
    "module": "commonjs",           
    "strict": true,
    "esModuleInterop": true,        
    "sourceMap": true,
    "lib": ["ESNext", "DOM", "ES2020.OptionalChaining", "ES2020.NullishCoalescing"]
  }
}

(Es posible que necesites reconstruir tu proyecto de TypeScript (con npx tsc) después para que se aplique el cambio)

Respuesta #2

Puedes omitir la carpeta node_modules como se indica a continuación

{
  "compilerOptions": {
  "skipLibCheck": true
  },
}

O

Línea de comandos tsc --skipLibCheck

O

  "include": [
  "src/*"
  ],
  "exclude": [
  "node_modules",
  "./node_modules",
  "./node_modules/*",
  "./node_modules/@types/node/index.d.ts",
  ]
}

Artículos relacionados