我在我试图转换为使用TypeScript的项目中使用fabricjs,但我无法弄清楚如何使用它。以前我通过执行以下操作创建自己的自定义对象:
my.namespace.Control = fabric.util.createClass(fabric.Object, {
id: "",
type: 'Control',
color: "#000000",
...
});
在我的新项目中,我已经安装了来自here的TypeDefinition文件,但我无法弄清楚应该如何使用它?
查看.d.ts文件,fabric.Object似乎不是一个Function,所以不允许传递给createClass,而createClass本身返回void,所以我不能将值赋给a变量
即使所有这些都有效,我应该如何格式化它以便它以TypeScript方式工作?即,我要导出什么,以便我可以将其导入到需要Control类的其他位置?
任何人都有这样做的例子吗?
答案 0 :(得分:0)
您可以定义一个扩展结构类的typescript类。
export interface IMindObjectOptions {
item: IMindItem;
}
export interface IMindExpanderOptions extends IMindObjectOptions {
x: number;
y: number;
radius: number;
isExpanded: boolean;
}
export class MindExpander extends fabric.Circle implements IMindObjectOptions {
public constructor(options: IMindExpanderOptions) {
const circleOptions: ICircleOptions = {
originX: "center",
originY: "center",
left: options.x,
top: options.y,
radius: options.radius,
stroke: "#000000",
fill: options.isExpanded ? "#00FFFF": "#00FF00",
selectable: false
};
super(circleOptions);
this.item = options.item;
}
public readonly item: IMindItem;
}
!!!上面的代码在浏览器中工作正常,但在nodejs环境中没有。
要在nodejs环境中工作,例如在没有浏览器的情况下运行单元测试,您需要:
import {assert} from "chai";
import * as f from 'fabric';
import {ITextOptions} from "fabric";
declare function require(s: string): any;
declare const __dirname: string;
const fabric = require("fabric").fabric;
interface ITextConstructor {
new(text: string, options: ITextOptions): f.Text;
}
function getTextConstructor(): ITextConstructor {
return fabric.Text;
}
describe("nodejs setup", function () {
it("fabric is imported correctly", function () {
const x = fabric.Text as f.Text;
assert.equal(typeof x, "function");
});
it("fabric class is extensible", function () {
class SubText extends getTextConstructor() {
public constructor(text: string, options: fabric.ITextOptions) {
super(text, options);
}
}
const c = new SubText("Hello", {left: 100, top: 100});
assert.equal(c.text, "Hello");
assert.isNotNull(c);
});
});
答案 1 :(得分:-1)
使用fabricjs.d.ts的旧方法位于文件的顶部:
^(?!.*car).*report((?!.*car).*)\.txt$
如果您使用tsd获得它,则必须引用您的tsd.d.ts捆绑文件
但现在使用typescript 1.6.2和vscode,你只需要通过tsd下载参考文件来获取代码中的定义。
在d.ts文件中,您可以找到2个方法签名:
/// <reference path="path/to/your/fabricjs.d.ts" />
因此,您的代码似乎无效,因为作为接口IObjectStatict的fabric.Object不能对Function类型进行指定。您可以将fabric.Object强制转换为函数
createClass(parent: Function, properties?: any): void;
createClass(properties?: any): void;