Par exemple, j'ai ces types :
class User extends Entity {}
class Post extends Entity {}
type Entities = {
user: User,
post: Post,
// potentially hundreds more
};
type EntityType = 'user' | 'post' | ...;
Quand j'utilise Entities
y EntityType
en générique, cela ralentit sensiblement Typescript. Il faut plusieurs minutes rien que pour afficher les informations de type dans VS Code. J'ai des fonctions génériques comme :
function getEntityFromCache<T extends EntityType>(type: T, id: number): Entities[T] | null | undefined;
function getEntity<T extends EntityType>(type: T, id: number): Entities[T] | null {
const cachedEntity = getEntityFromCache(type, id);
if (cachedEntity !== undefined) {
return cachedEntity;
}
...
}
Si je comprends pourquoi c'est lent, c'est parce que Entities[T]
est une union de toutes les valeurs de Entities
c'est-à-dire User | Post | ...
. TS ne gère pas bien les unions. Pour vérifier que le type de retour de cached
est correcte, TS doit itérer à travers toutes les valeurs possibles de T
. C'est-à-dire que si T = 'user'
vérifiez que cachedEntity
es Entities['user']
; si T = 'post'
vérifiez que cachedEntity
es Entities['post']
et ainsi de suite. C'est lent car TS doit vérifier chaque valeur de l'union à chaque fois que j'ai un générique.
En outre, plutôt que de simplement comparer les valeurs des génériques ( 'user' === 'user'
, 'post' === 'post'
), TS compare l'entité entière ( User === User
, Post === Post
). Cela aggrave la situation car les entités sont compliquées.
Quels sont les moyens d'accélérer le processus ? Voici quelques idées que j'ai :
-
Supprimez les génériques des fonctions intermédiaires et faites en sorte qu'elles renvoient le type d'entité de base, puis effectuez un cast de type. Par exemple
function getEntityFromCache(type: T, id: number): Entity | null | undefined;
-
D'une manière ou d'une autre, faites en sorte que TS compare la chaîne de caractères du type d'entité au lieu de comparer les entités entières.