Tengo una dependencia opcional y dependiente de la plataforma en mi proyecto, que quiero importar condicionalmente así:
import os from 'os'; export default async function doSomething(): Promise<foo | null> { if(os.type() === 'some os') { // "platform-dependent-module" exposes type "foo" const module = await import("platform-dependent-module"); // do stuff return bar; // bar is of type foo } return null; } sin embargo, esto no funciona porque el compilador Cannot find name 'foo' . ¿Es posible exponer la definición de tipo sin tener que importar estáticamente el módulo?
Aparentemente, es posible importar y exponer el tipo por separado. Entonces uno puede importar estáticamente el tipo así:
import type {foo} from 'moduley hacer uso del tipo, antes de cargar dinámicamente todo el módulo. El código final sería algo como esto:
import os from 'os'; import type {foo} from 'platform-dependent-module'; export default async function doSomething(): Promise<foo | null | Error> { if(os.type() === 'some os') { try { // "platform-dependent-module" exposes type "foo" const module = await import('platform-dependent-module'); // do stuff return bar; // bar is of type foo } catch (e) { return e; } } return null; }Sí, puede usar Type Aliases de TypeScript .
Y también asegúrese de que el tipo de devolución sea una promesa en una función asíncrona.
Y la palabra clave catch debe reemplazarse con else pero no hay necesidad de else .
import os from 'os'; type foo = any; export default async function doSomething(): Promise<foo | null> { if(os.type() === 'some os') { // "platform-dependent-module" exposes type "foo" const module = await import("platform-dependent-module"); // do stuff return bar; // bar is of type foo } return null; }