La compilación de mecanografiado está tardando mucho en ejecutarse, así que utilicé generateTrace de https://github.com/microsoft/TypeScript/pull/40063
Mostró que la mayor parte del tiempo estaba comparando clases complicadas con sus subclases. Por ejemplo, una de las clases es el modelo base Objection ( https://github.com/vincit/objection.js ), que es la clase base que heredan todos mis modelos.
Por ejemplo, tengo un código como:
class User extends Model {} function doSomething(model: typeof Model) {} doSomething(User); Tengo ~50 modelos. Creo que la primera vez que TS encuentra cada modelo es lento, luego lo almacena en caché. TS tarda aproximadamente 5 segundos en comparar un modelo específico con el Model base. Model usa tipos de varias bibliotecas. Aquí hay una captura de pantalla de la traza, se tarda 5 minutos en comparar cada modelo con Model :
¿Hay alguna manera de hacer que TS salte la comparación de Model consigo mismo? Es decir, dado que el User extiende el Model , no es necesario verificar los campos que heredó.
Editar:
Reduje el tiempo para revisar los 50 modelos de 5min a 30s. Tengo un mapa de modelos:
type ModelType = 'user' | ... type ModelsMap = { user: User, ... }; getModel<T extends ModelType>(type: T): ModelsMap[T] {} Esto es lento porque ModelsMap[T] es una unión de todos los modelos. Se volvió más rápido si devuelvo el modelo base cuando T es una unión de todos los tipos de modelos:
type TypeToModel<T extends ModelType> = ModelType extends T ? Model : ModelsMap[T]; getModel<T extends ModelType>(type: T): TypeToModel<T> {}Sin embargo, sería bueno saber si hay trucos para hacer que la comparación de subclases sea más rápida. Por ejemplo, si es posible deshabilitar la escritura estructural y usar nominal para las subclases.
No estoy seguro de que sea muy útil en su caso, pero puede acelerar drásticamente el proceso al permitir el indicador incremental en su comando tsc :
// package.json "tsc": "tsc -v && tsc --noEmit --skipLibCheck --incremental", Esto creará un archivo tsconfig.tsbuildinfo , que en realidad es un gráfico de su base de código. Typescript solo comparará las entradas que haya cambiado. La primera compilación será lenta, porque generará el gráfico, pero después, el tiempo de compilación se reducirá en 3 por lo menos.
Algunas banderas tsc que pueden ayudar con la velocidad de compilación de TypeScript son skipLibCheck e incremental
Si eso aún no es lo suficientemente rápido, considere usar un compilador diferente a tsc (al menos en desarrollo). Algunos ejemplos de lo que podrías usar: