打字稿定义。全局变量和模块名称相同

时间:2014-05-18 23:32:58

标签: typescript

我只是想在TypeScript中乱用PaperJS而找不到定义,所以我正在创建自己的定义。

在处理定义文件时,我曾经看过两次。就我而言,有一个名为paper的全局变量。但似乎还有一个名为纸的模块。

如何处理此问题而不会出现重复的标识符错误?

重要提示!也许纸张没有模块名称....也许每个功能都在全球范围内。我真的不明白the architecture

paper.d.ts

declare var paper: paper.PaperScope;

declare module paper{
    export class PaperScope{
       ....
    }
}

重复标识符'论文

1 个答案:

答案 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;
}