Búsqueda de sitios web

typescript - ¿Cómo puedo usar la API del compilador de TS para ver si los tipos en un .d.ts han cambiado?


Me gustaría poder saber si los tipos en un archivo de declaración de TypeScript han cambiado desde la última compilación. Algunos falsos positivos están bien (decir que los tipos han cambiado cuando no lo han hecho), pero no está bien decir que nada ha cambiado cuando algo sí ha cambiado.

Para un .d.ts sin importaciones, podría hacer una comparación de cadenas entre el viejo .dts y el nuevo .d.ts.

Pero cuando un .d.ts tiene importaciones, su significado puede depender de lo que hay en otros archivos:

import { OtherType } from "./other"
export type Wrapped = { other: OtherType }

En ese caso, podría recorrer recursivamente y serializar Wrapped, luego comparar las representaciones serializadas. Pero las cosas se complican bastante con los tipos recursivos.

Para los tipos nominales, creo que tendría que correlacionar NodeIds o algo así.

¿Hay algo en la API del compilador de TS que ya haga esto o un enfoque alternativo para resolver el problema?

Respuesta #1

Creo que la forma más eficiente de hacerlo sería trabajar solo con los ASTs. Así que en lugar de una diferencia basada en texto, podrías hacer una "diferencia semántica" donde analices los ASTs usando ts.createSourceFile, recorras los nodos usando ts.forEachChild creando tu propia estructura tipo tabla de símbolos de ambos archivos de declaración, el antiguo y el nuevo, y luego compares las estructuras para encontrar diferencias. Dependiendo del alcance de la implementación, podría llevar a algunos falsos positivos y tendrías que hacer que entienda cómo seguir los especificadores de módulo de las declaraciones de importación y exportación hacia los otros archivos.

Un enfoque alternativo sería usar el verificador de tipos y obtener el símbolo de ambos archivos fuente (const fileSymbol=typeChecker.getSymbolAtLocation(sourceFile);). A partir de ahí, podrías comparar las claves en la propiedad exports y luego navegar a través de los valores hasta las declaraciones (por ejemplo, ver esta respuesta).

De todos modos, esta es una respuesta bastante a nivel alto. Avísame si quieres que entre en más detalle sobre algo. Lo que estás haciendo es una herramienta que está esperando ser creada (por ejemplo, revisar un archivo de declaración para cambios que rompan compatibilidad).