Transcripción: ¿Cómo puede un módulo de ser encontrado, pero no se ha resuelto? ¿Qué tiene esto que ver con la "noResolution'?

Cuando ejecuto el tsc en el 'value' directorio con --traceResolution, veo el módulo de 'foo' es "resuelto con éxito", pero no "encontró":

======== Module name 'foo' was successfully resolved to 'C:/dev/ts-options/typings/foo/index.d.ts'. ========

main.ts(1,18): error TS2307: Cannot find module 'foo'.

Ajuste de "noResolve": true en tsconfig.compilerOptions hace que el error desaparece. Pero estoy supr-confundido!

Pregunta 1: ¿Cuál es la diferencia entre la "resolución" y "buscar"? Pensé que estos eran sinónimos

Pregunta 2: ¿por Qué "noResolve' afecta este comportamiento? ¿Qué noResolve realmente? TS opciones del compilador docs decir "no agregar triple-barra de referencias o la importación de módulos objetivos para la lista de archivos compilados." pero no sé lo que eso significa.

Con esta estructura de directorios

  • /c/dev/ts-opciones/
    • tipificaciones/
      • foo
        • índice.d.ts
    • proj aquí es donde me estoy quedando tsc
      • tsconfig.json
      • principal.ts

proj/tsconfig.json (problema se ha solucionado, si me cambio de noResolve false):

{
    "compilerOptions": {
        "baseUrl": ".",
        "types": [],
        "outDir": "../out",
        "paths": {
            "foo": [
                "../typings/foo"
            ],
        },
        "noResolve": true
    },
    "include": [
        "**/*.ts",
    ],
    "exclude": [
        "node_modules"
    ]
}

proj/main.ts:

import foo from "foo"

tipificaciones/foo/index.d.ts:

declare function foo(num: number): number;
export default foo;

Actualización

Dos soluciones:

  • Conjunto de noResolve: false
  • O añadir "../tipificaciones" para el apartado "incluye" en el tsconfig

Mi conjetura es que hay un concepto de una "unidad de compilación" tal que:

  • con noResolve: false a continuación, la unidad de compilación puede crecer de forma dinámica como el TS de la siguiente manera imports.

  • Con noResolve: true, entonces la unidad de compilación se fija a algo como tsconfig.baseUrl/** + (tsconfig.include - tsconfi.exclude) .

  • Cuando un archivo está fuera de la unidad de compilación, a continuación, TS puede "resolver" una importación (encontrar el camino hacia una .d.ts/.ts/.tsx archivo), pero no 'buscar' (en realidad leer el archivo).

Este aún no tiene sentido para mí, sin embargo. ¿Cuál es el punto de 'resolver' a una ubicación que uno sabe que no será capaz de 'buscar'?

1 Respuestas

  • J. Koutsoumpas
    1 de mayo de 2019

    La causa de este problema es un error de nombre de ruta de acceso en la paths opción en tsconfig.json. Se define una ruta de llamada foo para que apunte a "../tipificaciones/foo" relativa a la raíz del proyecto, pero que no es correcto debido a que, como se traduce en una ruta inexistente:

    Suponiendo que el proj directorio es este:

    C:/dev/ts-options

    a continuación, se combinan con el definido foo la ruta que se expande a:

    C:/dev/ts-options/../typings/foo

    que se traduce en la inexistencia de una ruta de acceso:

    C:/dev/rp-build/node/rp-cli/test/fixtures/src/typescript/typings/foo.

    La resolución de la encuentra, finalmente, por todos los directorios pero el import utiliza el foo nombre de ruta de acceso que se traduce a la anterior equivocado de ruta de acceso completa.

    Así que hay dos soluciones, o bien corregir la foo definición de la ruta en el tsconfig.json, o utilizar una ruta de acceso relativa a la principal.ts de foo/index.d.ts en el import declaración como esta:

    import foo from "../../../whatever/typings/foo"