Typescript: typeRoots no encuentra el archivo de declaración personalizado

Creado en 28 feb. 2018  ·  15Comentarios  ·  Fuente: microsoft/TypeScript



Versión de TypeScript:
Versión 2.6.2


Términos de búsqueda:
archivo de declaración para la función de exportación del módulo, módulo externo, paquete npm, módulo de terceros

Código
src/testFile.ts :

import getFieldList = require('graphql-list-fields');

src/@types/graphql-list-fields/index.d.ts :

// Doing just this below (as suggested by the Typescript Handbook does not work 
// and results in the tsc error under **Actual behavior** below
import { GraphQLResolveInfo } from 'graphql';
declare function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;

// The code below is what actually works instead of the above
/*
declare module 'graphql-list-fields' {
    import { GraphQLResolveInfo } from 'graphql';
    function getFieldList(info: GraphQLResolveInfo): string[];
    export = getFieldList;
}
*/

Comportamiento esperado:
Compilando sin errores.

Comportamiento real:
Error al ejecutar tsc :

src/testFile.ts(1,31): error TS7016: Could not find a declaration file for module 'graphql-list-fields'. '/node_modules/graphql-list-fields/index.js' implicitly has an 'any' type.
Try `npm install @types/graphql-list-fields` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql-list-fields';`

graphql-list-fields es un paquete NPM que estoy tratando de usar, que actualmente no tiene declaraciones de tipo publicadas.

Después de leer la sección del Manual de Typescript sobre archivos de declaración, descubrí que estoy tratando de escribir un archivo de declaración para una biblioteca modular y debería usar la plantilla de archivo de declaración module-function.d.ts . Así es como se me ocurrió el código en index.d.ts arriba, pero el compilador todavía se queja de no tener el archivo de declaración para el módulo 'graphql-list-fields'. Después de prueba y error, descubrimos que agregar declare module 'graphql-list-fields' alrededor de todo funcionaba sin errores del compilador.

Intentamos configurar "typeRoots": ["./node_modules/@types", "./src/@types"] en tsconfig.json , como se menciona en los documentos tsconfig, pero aún así no funcionó sin declare module 'graphql-list-fields' . Esto parece ser un problema porque tsc no encuentra la declaración de tipo en los directorios especificados en typeRoots.

Asuntos relacionados:
3019 , 8335

Question

Comentario más útil

TypeRoots es realmente un soporte que hemos agregado para la compatibilidad con versiones anteriores y para permitir la migración, por lo que intentamos mantenerlo fuera de los documentos tanto como sea posible para evitar confusiones.

@mhegazy Tener una función compatible con poca o ninguna documentación es lo que genera confusión. Documente correctamente características como esta, pero sea liberal con su lenguaje de advertencia. Por ejemplo:

_ Nota: Esta función se proporciona para compatibilidad con versiones anteriores de tipificaciones para admitir la migración. Consulte las notas de la versión [aquí] para obtener más información.

Esto sería _muy_ preferible a tener que escanear problemas de GitHub, StackExchange, etc. para obtener información.

Todos 15 comentarios

"typeRoots" es para código global. es decir, algo que se declara en el espacio de nombres global y desea incluirlo. esta es la razón por la que su declare module 'graphql-list-fields' {.. funciona, ya que simplemente declara un módulo con ese nombre en el espacio de nombres global.

Para los módulos, tienen su propio alcance, todo lo que necesita es mapeo de rutas.

algo como:

{
    "compilerOptions": {
        "target": "es5",
        "baseUrl": "./",
        "paths": {
            "*" : ["src/@t`ypes/*"]
        }
    }
}`

Gracias por aclarar eso @mhegazy. Creo que sería útil si esto se explicara más en los documentos de TypeScript, posiblemente en la sección de archivos de declaración .

TypeRoots es realmente un soporte que hemos agregado para la compatibilidad con versiones anteriores y para permitir la migración, por lo que intentamos mantenerlo fuera de los documentos tanto como sea posible para evitar confusiones.

No estoy seguro si esto encaja en la sección del archivo de declaración. tenemos una nota al respecto en https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping

Puedo agregar una nota en la sección del archivo de declaración sobre la sección de resolución del módulo en su conjunto.

lea esa sección y avísenos si aún encuentra documentos que faltan

Oh ya veo. Sí, esa es la página con la que necesitaba empezar. Creo que sería bueno tener al menos una breve mención del mapeo de rutas y tal vez un enlace a ese documento en algún lugar en https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html.

Cerrando automáticamente este problema con fines de limpieza. Las etiquetas de los problemas indican que no es factible en este momento o que ya se ha abordado.

Sigo pensando que sería útil tener los documentos actualizados como se indica en mi comentario anterior @ typecript-bot

TypeRoots es realmente un soporte que hemos agregado para la compatibilidad con versiones anteriores y para permitir la migración, por lo que intentamos mantenerlo fuera de los documentos tanto como sea posible para evitar confusiones.

@mhegazy Tener una función compatible con poca o ninguna documentación es lo que genera confusión. Documente correctamente características como esta, pero sea liberal con su lenguaje de advertencia. Por ejemplo:

_ Nota: Esta función se proporciona para compatibilidad con versiones anteriores de tipificaciones para admitir la migración. Consulte las notas de la versión [aquí] para obtener más información.

Esto sería _muy_ preferible a tener que escanear problemas de GitHub, StackExchange, etc. para obtener información.

¡Gracias una puta tonelada @mhegazy ! : tada: Esa entrada de ruta para @types fue finalmente la pieza faltante que hizo que la configuración de mi proyecto no estándar funcionara. Pasé días en esto.

Si no le importa ralentizar un poco el proceso de inicio de su aplicación, puede agregar TS_NODE_FILES=true al script de inicio de su package.json y se encontrarán todos los archivos de declaración personalizados.

Ahora estoy obteniendo:

The following changes are being made to your tsconfig.json file:
  - compilerOptions.paths must not be set (aliased imports are not supported)

y esta opción se está eliminando.

@KrzysztofMadejski lo hace CRA, no TS en sí.

Este hilo dice que typeroots es realmente para compatibilidad con versiones anteriores. Estoy tratando de usarlo para escribir tipos de escritura definitiva. ¿De qué otra manera podría probar correctamente estos tipos sin typeroots? He generado tipos usando dts-gen y agregué types a mis raíces de tipo y todavía no tuve suerte :-(

@Roaders , ¿encontraron la solución para usar dts-gen tipos generados?

Editar: resuelto con https://github.com/microsoft/TypeScript/issues/22217#issuecomment -369783776

Una cosa que no entiendo aquí es que:

tsconfig.base.json:

"typeRoots": ["node_modules/@types", "types"],

Y una estructura de directorio:

/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts

No se recogerá en absoluto en mi repositorio nrwl / nx. Puedo probar un millón de cosas, pero si muevo esa carpeta something-else a node_modules/@types , funcionará mágicamente y será recogido, lo que sugiere que typeRoots no hace absolutamente nada como node_modules/@types se maneja mágicamente.

Marcar typeRoots como obsoleto y decir que funciona de una manera extraña / peculiar al menos me habría impedido intentar usarlo.

La única forma en que he logrado agregar tipos locales cada vez que lo he necesitado es pasando horas peleando con mi tsconfig.base.json y tropezando con el comentario mhegazy anterior

Seguí siendo mordido por esto y olvidándome de tener que configurar la opción paths también, así que creé un repositorio simple con la configuración adecuada. Espero que ayude a alguien.

¿Fue útil esta página
0 / 5 - 0 calificaciones