Lor*_*igs 4 amd typescript typescript-typings
我正在尝试在Typescript中编写一个lib,我想在其他各种Typescript或JS项目中使用它。所有其他项目都在浏览器中运行。
我的Typescript lib项目有多个文件,每个文件都是一个具有1个类和1-2个接口的React组件(对于熟悉React的组件,则为Component + Props + State)。
我希望我的组件库可以被其他项目作为AMD模块导入,并且我希望所有已编译的JS代码都捆绑在一个文件中,作为该库构建过程的一部分。
到目前为止,我已经成功设置了所有内容,以便我的lib可以编译。我使用以下选项设置了编译器:jsx: "react", declaration: true, module: "amd"
lib生成的代码如下所示:
define("epb-widget/WidgetItemNav", ["require", "exports", "react"], function (require, exports, React) {
"use strict";
exports.WidgetItemNav = ...;
});
define("epb-widget/WidgetItemInfo", ["require", "exports", "react"], function (require, exports, React) {
"use strict";
exports.WidgetItemInfo = ...;
});
define("epb-widget/WidgetItem", ["require", "exports", "react", "epb-widget/WidgetItemNav", "epb-widget/WidgetItemInfo"], function (require, exports, React, WidgetItemNav_1, WidgetItemInfo_1) {
"use strict";
exports.WidgetItem = ...;
});
define("epb-widget/WidgetOptions", ["require", "exports", "react"], function (require, exports, React) {
"use strict";
exports.WidgetOptions = ...;
});
define("epb-widget/Widget", ["require", "exports", "react", "epb-widget/WidgetItem", "epb-widget/WidgetOptions"], function (require, exports, React, WidgetItem_1, WidgetOptions_1) {
"use strict";
exports.Widget = ...;
});
define("epb-widget", ["require", "exports", "epb-widget/Widget", "epb-widget/WidgetItem", "epb-widget/WidgetItemInfo", "epb-widget/WidgetItemNav", "epb-widget/WidgetOptions"], function (require, exports, Widget_1, WidgetItem_2, WidgetItemInfo_2, WidgetItemNav_2, WidgetOptions_2) {
"use strict";
exports.Widget = Widget_1.Widget;
exports.WidgetItem = WidgetItem_2.WidgetItem;
exports.WidgetItemInfo = WidgetItemInfo_2.WidgetItemInfo;
exports.WidgetItemNav = WidgetItemNav_2.WidgetItemNav;
exports.WidgetOptions = WidgetOptions_2.WidgetOptions;
});
Run Code Online (Sandbox Code Playgroud)
根据我的口味,有很多AMD模块,但是我可以接受。生成的代码看起来可以正常工作。
生成的.d.ts文件如下所示:
declare module "epb-widget/WidgetItemNav" {
import * as React from "react";
export interface WidgetItemNavProps {
...
}
export class WidgetItemNav extends React.Component<WidgetItemNavProps, void> {
...
}
}
declare module "epb-widget/WidgetItemInfo" {
export interface WidgetItemInfoProps {
...
}
export const WidgetItemInfo: (props: WidgetItemInfoProps) => JSX.Element;
}
declare module "epb-widget/WidgetItem" {
export interface WidgetItemProps {
...
}
export const WidgetItem: (props: WidgetItemProps) => JSX.Element;
}
declare module "epb-widget/WidgetOptions" {
import * as React from "react";
export interface WidgetOptionsProps {
...
}
export interface WidgetOptionsState {
...
}
export class WidgetOptions extends React.Component<WidgetOptionsProps, WidgetOptionsState> {
...
}
}
declare module "epb-widget/Widget" {
import * as React from "react";
import { WidgetItemProps } from "epb-widget/WidgetItem";
export interface WidgetProps {
...
}
export interface WidgetState {
...
}
export class Widget extends React.Component<WidgetProps, WidgetState> {
...
}
}
declare module "epb-widget" {
export { Widget, WidgetProps } from "epb-widget/Widget";
export { WidgetItem, WidgetItemProps } from "epb-widget/WidgetItem";
export { WidgetItemInfo, WidgetItemInfoProps } from "epb-widget/WidgetItemInfo";
export { WidgetItemNav, WidgetItemNavProps } from "epb-widget/WidgetItemNav";
export { WidgetOptions, WidgetOptionsProps } from "epb-widget/WidgetOptions";
}
Run Code Online (Sandbox Code Playgroud)
同样,这看起来很合理。这都是Typescript编译器直接输出的。
最后,这个库是一个npm模块,它package.json看起来像这样
{
"name": "epb-widget",
"version": "1.0.0",
"description": "...",
"main": "./dist/index.js",
"typings": "./dist/index",
"globalDependencies": {...},
"devDependencies": {...}
}
Run Code Online (Sandbox Code Playgroud)
但这是问题
当我尝试在我的一个项目中使用该库时,它实际上不起作用。
我只是尝试导入这样的类:
import {Widget, WidgetProps, WidgetItem} from "epb-widget";
Run Code Online (Sandbox Code Playgroud)
但是打字稿编译器抛出以下错误
error TS2656: Exported external package typings file '.../node_modules/epb-widget/dist/index.d.ts' is not a module. Please contact the package author to update the package definition.
Run Code Online (Sandbox Code Playgroud)
老实说,我不知道该怎么办。index.d.ts是由生成的tsc,但我不确定为什么它tsc不能在另一个项目中使用它。
这太长了,无法进行上面的讨论,但这是我创建图书馆的TL; DR:
创建一个index.ts重新导出库中公开的定义的,例如
export * from './API'
export * from './Decorators'
...
Run Code Online (Sandbox Code Playgroud)使用--declaration标志编译库文件以自动生成类型
typings条目以package.json指向生成的index.d.ts文件要使用该库:
node_modules像其他任何库一样将其放在文件夹中import * as mylib from 'mylib':它会自动导入所有导出的定义和对分型commonjs从我所了解的角度来看,此过程也可以很好地工作systemjs。我不知道amd,并且您生成的类型与我的完全不同:
生成的index.d.ts通常看起来像
export * from './API';
export * from './Decorators';
...
Run Code Online (Sandbox Code Playgroud)
该API.d.ts文件通常看起来像
import * as stream from 'stream';
import * as net from 'net';
import * as url from 'url';
export interface Factory {
end(): Promise<void>;
}
export interface ChannelFactory extends Factory {
getChannel(name: string, closeListener?: () => void): Promise<Channel>;
existsChannel(name: string): Promise<boolean>;
}
....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10042 次 |
| 最近记录: |