Как использовать типы с динамическим импортом?

При компиляции шаблоны должны быть созданы экземплярами , прежде чем их компилировать в объектный код. Это создание может быть достигнуто только в том случае, если известны аргументы шаблона. Теперь представьте сценарий, в котором функция шаблона объявлена ​​в a.h, определенная в a.cpp и используемая в b.cpp. Когда компилируется a.cpp, не обязательно известно, что для предстоящей компиляции b.cpp потребуется экземпляр шаблона, не говоря уже о том, какой конкретный экземпляр это будет.

Можно утверждать, что компиляторы можно сделать умнее, чтобы «смотреть вперед» для всех применений шаблона, но я уверен, что это было бы нелегко создавать рекурсивные или другие сложные сценарии. AFAIK, компиляторы этого не делают. Как заметил Антон, некоторые компиляторы поддерживают явные декларации экспорта экземпляров шаблонов, но не все компиляторы поддерживают его (пока?).

2
задан MrVoodoo 16 January 2019 в 10:20
поделиться

2 ответа

XLSX будет представлять только стоимость импорта, а не типы.

У вас есть два варианта.

Используйте тип импорта:

import('xlsx').then(XLSX => {
    const wb: import('xlsx').WorkBook = XLSX.read(bstr, { type: 'binary' });
})

Вы можете определить псевдоним типа, чтобы сделать это проще: type WorkBook = import('xlsx').WorkBook

Импорт тип:

import { WorkBook } from 'xlsx' // Just for the type, will be elided in this example

import('xlsx').then(XLSX => {
    const wb: WorkBook = XLSX.read(bstr, { type: 'binary' });
})

Этот второй вариант сложнее понять, если вы используете импорт из статического импорта в типах, оператор импорта должен быть исключен (т.е. не выводится в JS). ). Как только вы используете какой-либо импорт из статического импорта в выражении (т. Е. Любую позицию, которая окажется в JS), импорт не будет отменен. Подробнее о модуле :

0
ответ дан Titian Cernicova-Dragomir 16 January 2019 в 10:20
поделиться

Я не знаю ваш контекст, поэтому я предполагаю две вещи:

  1. Вы определили тип XLSX в другом месте, но переменная параметра XLSX скрывает внешнюю переменную. Чтобы избежать затенения, просто используйте другое имя для переменной параметра (например, добавьте подчеркивание):

    import('xlsx').then(_XLSX => {
        const wb: XLSX.WorkBook = _XLSX.read(bstr, { type: 'binary' });
    })
    
  2. Вы думаете, что XLSX.WorkBook - это тип, но это не так! XLSX - это библиотека javascript, и у javascript нет понятия типа. Также при использовании TypeScript он передается в javascript, и любая информация о типе теряется. Для этой проблемы нет решения, но, вероятно, вам придется импортировать тип из другого места, например, DefinetelyTyped. Просто импортируйте тип в ваш компонент, и вы сможете его использовать.

0
ответ дан Cristian Traìna 16 January 2019 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: