suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Typescript deklariert benannte Exporte dynamisch in d.ts

Ich habe eine Komponentenbibliothek für VueJs in TypeScript erstellt und möchte sie global in meiner Vue-Instanz verwenden (mit Vue.use(library)) oder einzeln verwenden (mithilfe benannter Importe in Vue-Komponenten) < /p>

Es funktioniert gut, aber ich habe einige Probleme mit TypeScript, wenn ich alle Komponenten in der index.d.ts-Datei dynamisch deklarieren möchte (da es viele Komponenten gibt und ich es nicht manuell tun möchte)

So funktioniert das:

import { Component1, Component2 } from 'my-library';

declare module 'my-library' {
  declare const lib: PluginFunction<any>;
  export default lib;

  export { Component1, Component2 } from 'my-library';
}

Aber ich suche nach einer Möglichkeit, dies für alle Komponenten zu tun, ohne sie einzeln zu importieren und zu exportieren.

Ich habe so etwas versucht:

...
export * from 'my-library'
...

oder

import * as components from 'my-library';

declare module 'my-library' {
  declare const lib: PluginFunction<any>;
  export default lib;

  Object.entries(components).forEach(([componentName, component]) => {
    export { component as componentName };
    // or
    // export { component };
  })
}

Aber es funktioniert nicht. Wenn ich import { Component1 } from 'my-library' ausführe, erhalte ich den TS-Fehler:

"Symbol „Komponente1“ konnte nicht aufgelöst werden TS2614: Das Modul „my-library“ exportiert das Mitglied „Component1“ nicht. Planen Sie die Verwendung von „Komponente1 aus „Meine Bibliothek“ importieren“?

ps: Wenn ich //@ts-ignore vor dem Import verwende, funktioniert alles einwandfrei.

Irgendwelche Ideen?

P粉642436282P粉642436282268 Tage vor416

Antworte allen(1)Ich werde antworten

  • P粉739886290

    P粉7398862902024-02-27 09:24:22

    我的猜测是,这是因为 TS 在构建时需要一些东西来进行“类型检查”。换句话说,TS 比 JS 更具限制性,这是失去灵活性的主要示例之一,因为它希望在构建时而不是运行时进行定义。

    简而言之,你不能这样做。您唯一能做的就是导出键控对象中的所有内容,但这意味着当您将其导入另一个文件中时,您必须获取整个内容而不能获取其中的一部分。

    文件.vue

    
    
    

    Antwort
    0
  • StornierenAntwort