Vyhledávání na webu

typescript - Existuje nějaký způsob, jak bezpečně typovat funkci import()?


Výraz import() v TypeScriptu umožňuje načítat kód až při běhu programu. Mohu například zavolat await import('@my-app/a/b') a obdržet objekt, který má přesně ty členy, které jsou exportovány z odkazovaného zdrojového modulu.

Toto je typově bezpečné; kompilátor TypeScriptu během návrhu ví, jaké členy budou k dispozici na vráceném objektu na základě cesty.

Existuje nějaký způsob, jak obalit tento výraz import() a stále získat zpět silně typovaný objekt?

Případ použití by byl takový, že mohu provést některé standardní operace na vráceném objektu, než bude předán zpět volajícímu kódu.

Například:

Použití holého lazy-loadovaného modulu:

const module = await import('@my-app/a/b');
module.doSomething();

Použití modulů načítaných na vyžádání až po dokončení standardních operací:

const module = await loadAndProcessModule('@my-app/a/b');
module.doSomething();

Otázka je, jak implementovat, nebo alespoň deklarovat, loadAndProcessModule, aniž by byla narušena bezpečnost typů.

Odpověď č. 1

Myslím, že abyste to mohl udělat, musel byste být schopen vyjádřit typeof import("module-specifier") jako generikum. Například podpis vaší funkce loadAndProcessModule by měl vypadat nějak takto:

function loadAndProcessModule<T extends string>(moduleSpecifier: T): typeof import(T) {
   // ...
}

Bohužel to dnes v Typescriptu není možné - viz tato otázka a tento otevřený požadavek na funkci.