如何将类型与动态导入一起使用?
How to use types with dynamic imports?
我在 Angular 7 中使用动态导入来减小初始供应商包的大小。
import('xlsx').then(XLSX => {
const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });
})
但是 XLSX.WorkBook
类型有一个错误说:
Cannot find namespace XLSX.
XLSX.read
工作正常。
问题:使用动态导入时如何定义类型?
我不知道你的上下文,所以我想有两件事:
您在别处定义了 XLSX 类型,但 XLSX 参数变量正在隐藏外部变量。为避免阴影,只需为参数变量使用另一个名称(例如在前面加上下划线):
import('xlsx').then(_XLSX => {
const wb: XLSX.WorkBook = _XLSX.read(bstr, { type: 'binary' });
})
你以为XLSX.WorkBook
是一种类型,其实不是! XLSX 是一个 javascript 库,javascript 没有类型的概念。此外,在使用 TypeScript 时,它会被转译为 javascript 并且有关类型的任何信息都会丢失。这个问题没有解决方案,但您可能必须从其他地方导入类型,例如 DefinetelyTyped。只需在您的组件中导入类型,然后您就可以使用它。
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 中结束的任何位置),导入将不会被省略。查看更多关于 module being elided
我在 Angular 7 中使用动态导入来减小初始供应商包的大小。
import('xlsx').then(XLSX => {
const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });
})
但是 XLSX.WorkBook
类型有一个错误说:
Cannot find namespace XLSX.
XLSX.read
工作正常。
问题:使用动态导入时如何定义类型?
我不知道你的上下文,所以我想有两件事:
您在别处定义了 XLSX 类型,但 XLSX 参数变量正在隐藏外部变量。为避免阴影,只需为参数变量使用另一个名称(例如在前面加上下划线):
import('xlsx').then(_XLSX => { const wb: XLSX.WorkBook = _XLSX.read(bstr, { type: 'binary' }); })
你以为
XLSX.WorkBook
是一种类型,其实不是! XLSX 是一个 javascript 库,javascript 没有类型的概念。此外,在使用 TypeScript 时,它会被转译为 javascript 并且有关类型的任何信息都会丢失。这个问题没有解决方案,但您可能必须从其他地方导入类型,例如 DefinetelyTyped。只需在您的组件中导入类型,然后您就可以使用它。
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 中结束的任何位置),导入将不会被省略。查看更多关于 module being elided