我只是想在TypeScript中乱用PaperJS而找不到定义,所以我正在创建自己的定义。
在处理定义文件时,我曾经看过两次。就我而言,有一个名为paper的全局变量。但似乎还有一个名为纸的模块。
如何处理此问题而不会出现重复的标识符错误?
重要提示!也许纸张没有模块名称....也许每个功能都在全球范围内。我真的不明白the architecture。
paper.d.ts
declare var paper: paper.PaperScope;
declare module paper{
export class PaperScope{
....
}
}
重复标识符'论文
答案 0 :(得分:4)
在这种情况下,我认为您不需要单独声明纸质变量然后声明模块 - 它只能使用declare module paper
。图书馆可能会有更多改变方法,但我至少能够得到最初的例子。
手动生成TypeScript定义文件的推荐方法是将尽可能多的样本复制并粘贴到库的网站上,将其作为新的TypeScript文件中的单独函数,其中链接返回到哪里你找到了他们。关闭"允许隐含'任何'类型"在VS TypeScript Build窗口中,或使用--noImplicitAny命令行开关。然后在顶部引用你的d.ts文件并逐个开始处理每个错误。一旦你的TypeScript文件编译没有错误,你可以相信它至少就你所组装的测试而言是正确的。 (你实际上不需要"运行"任何测试 - 由于我们正在测试定义,而不是代码。)
注意:通常需要对样本进行微调,以根据需要进行投射。您可以看到我将canvas
投放为HTMLCanvasElement
。我可以让声明中的setup方法接受一个常规的HTMLElement。这将不需要getElementById()的强制转换,但它也不会在正确的方向上推动定义的用户,因此可能会涉及一些样式决策。
如果您想为库提供一个好的定义,请将它贡献给GitHub上的DefinitelyTyped库。 http://definitelytyped.org/guides/contributing.html
以下是我能够让您开始使用上述策略:
<强>纸tests.ts 强>
///<reference path="paper.d.ts" />
// tests for hypothetical paper.js definitions file.
/** Test from http://paperjs.org/tutorials/getting-started/using-javascript-directly/#making-the-scope-global */
function settingUpAScope() {
// Get a reference to the canvas object
var canvas = <HTMLCanvasElement>(document.getElementById('myCanvas'));
// Create an empty project and a view for the canvas:
paper.setup(canvas);
// Create a Paper.js Path to draw a line into it:
var path = new paper.Path();
// Give the stroke a color
path.strokeColor = 'black';
var start = new paper.Point(100, 100);
// Move to start and draw a line from there
path.moveTo(start);
// Note that the plus operator on Point objects does not work
// in JavaScript. Instead, we need to call the add() function:
path.lineTo(start.add([200, -50]));
// Draw the view now:
paper.view.draw();
}
<强> paper.d.ts 强>
declare module paper {
export class Path {
strokeColor: string;
moveTo: (destination: Point) => void;
lineTo: (destination: Point) => void;
}
export class Point {
constructor(x: number, y: number);
x: number;
y: number;
add: (something: number[]) => Point;
}
export interface IView {
draw: () => void;
}
var view: IView;
function setup(element: HTMLCanvasElement): void;
}