TypeScript 类型定义;在 Angular2 中使用外部 JavaScript 库的导出默认值
TypeScript type definition; export default for using external JavaScript library in Angular2
我正在尝试集成没有公开类型定义的 JavaScript 库 (bricks.js)。
基本上,库导出的内容是这样的:
export default (config) => {
const instance = SomeConstructorFunction(config);
return instance;
}
我不知道如何正确地为这个函数创建类型定义(.d.ts
);要么 tsc 在我导入时编译,我得到 undefined 要么 tsc 不会编译。
对于这个实例.d.ts
编译:
declare module 'bricks.js' {
export class Bricks {
constructor(config: any);
pack(); // some function available on the instance
}
}
但是如果我这样导入,在我的 AngularJs 2 组件中:
import { Bricks } from 'bricks.js';
this.bricks = new Bricks({//some config here});
那么 Bricks 是 undefined
,因此抛出错误 :-)。
我不知道如何为该库构建 .d.ts
;此外,该库是使用 Babel
编译的,我怀疑 Babel 对箭头函数默认导出做了一些事情...
好的,我找到了解决这个小噩梦的方法...
bricks.js 库是使用 ES6 模块(src 文件夹)定义的,但也是使用 Babel 构建的。
我正在使用 Systemjs 加载我的 Angular2 项目依赖项,
所以基本上我有两个选择:
使用 src 文件夹中的 ES6 bricks.js
。这意味着使用现代打字稿语法加载 ES6 模块,然后在 Systemjs 配置中声明一个转译器,以便它可以正确加载库及其依赖项。
或使用从 dist 文件夹转译的 Babel bricks.min.js
。我必须使用非模块实体语法。
见
我采用了第二种解决方案以避免从 Systemjs 进行转译。
这就是我所做的:
.index.d.ts
declare module 'bricks.js' {
interface Bricks {
pack();
}
function bricksFactory(config:any): Bricks
export = bricksFactory;
}
systemjs.config.js
...
var map = {
...
'bricks.js': 'node_modules/bricks.js/dist/'
...
}
...
var packages = {
...
'bricks.js': { main: 'bricks.min.js', defaultExtension: 'js'}
};
my.component.ts
import bricksFactory = require('bricks.js');
this.bricksInstance = Bricks({
container: '.mycontainer',
packed: 'data-packed',
sizes: [
{ columns: 2, gutter: 10 },
{ mq: '768px', columns: 3, gutter: 25 },
{ mq: '1024px', columns: 4, gutter: 50 }
]
});
您可以使用 import * as Bricks from 'bricks.js';
导入代码
您可以使用类似
的方式来定义它
declare module "Bricks" {
function loadConfig(config): SomeConstructorFunction;
var _tmp = loadConfig;
export = _tmp;
}
我正在尝试集成没有公开类型定义的 JavaScript 库 (bricks.js)。
基本上,库导出的内容是这样的:
export default (config) => {
const instance = SomeConstructorFunction(config);
return instance;
}
我不知道如何正确地为这个函数创建类型定义(.d.ts
);要么 tsc 在我导入时编译,我得到 undefined 要么 tsc 不会编译。
对于这个实例.d.ts
编译:
declare module 'bricks.js' {
export class Bricks {
constructor(config: any);
pack(); // some function available on the instance
}
}
但是如果我这样导入,在我的 AngularJs 2 组件中:
import { Bricks } from 'bricks.js';
this.bricks = new Bricks({//some config here});
那么 Bricks 是 undefined
,因此抛出错误 :-)。
我不知道如何为该库构建 .d.ts
;此外,该库是使用 Babel
编译的,我怀疑 Babel 对箭头函数默认导出做了一些事情...
好的,我找到了解决这个小噩梦的方法...
bricks.js 库是使用 ES6 模块(src 文件夹)定义的,但也是使用 Babel 构建的。
我正在使用 Systemjs 加载我的 Angular2 项目依赖项,
所以基本上我有两个选择:
使用 src 文件夹中的 ES6
bricks.js
。这意味着使用现代打字稿语法加载 ES6 模块,然后在 Systemjs 配置中声明一个转译器,以便它可以正确加载库及其依赖项。或使用从 dist 文件夹转译的 Babel
bricks.min.js
。我必须使用非模块实体语法。
见
我采用了第二种解决方案以避免从 Systemjs 进行转译。
这就是我所做的:
.index.d.ts
declare module 'bricks.js' {
interface Bricks {
pack();
}
function bricksFactory(config:any): Bricks
export = bricksFactory;
}
systemjs.config.js
...
var map = {
...
'bricks.js': 'node_modules/bricks.js/dist/'
...
}
...
var packages = {
...
'bricks.js': { main: 'bricks.min.js', defaultExtension: 'js'}
};
my.component.ts
import bricksFactory = require('bricks.js');
this.bricksInstance = Bricks({
container: '.mycontainer',
packed: 'data-packed',
sizes: [
{ columns: 2, gutter: 10 },
{ mq: '768px', columns: 3, gutter: 25 },
{ mq: '1024px', columns: 4, gutter: 50 }
]
});
您可以使用 import * as Bricks from 'bricks.js';
您可以使用类似
的方式来定义它declare module "Bricks" {
function loadConfig(config): SomeConstructorFunction;
var _tmp = loadConfig;
export = _tmp;
}