扩展原型

时间:2017-08-07 22:09:16

标签: javascript typescript

我正在将一些Javascript文件转换为项目中的Typescript文件。目前,我一直在努力转换Range3.js,一个依赖于另一个名为Cartesian3.js的Javascript文件的文件我为Cartesian3.js写了一个定义文件(d.ts),并且项目编译,但在运行时,我得到这个错误:

Uncaught ReferenceError: Cartesian3 is not defined

Cartesian3.js的格式如下:

define([
    './TypescriptFile'
    ],
function(
    TypescriptFile
    )
{
    /* file has some prototype-extending functions like this */
    Cesium.Cartesian3.prototype.extendingFunction = function()
    {
        /* function defined here */
    }

    /* and some static functions like this */
    Cesium.Cartesian.staticFunction = function()
    {
        /* function defined here */
    }

    /* more functions... */

    return Cesium.Cartesian3;
});

我为Cartesian3.js写的d.ts文件如下所示:

///<reference path="../../Cesium/Cesium.d.ts"/>
declare class Cartesian3 extends Cesium.Cartesian3 {
    extendingFunction(): void;
    static staticFunction(): Cartesian3;
    /* more functions listed here */
}

Range3.ts(抛出ReferenceError的文件)如下所示:

///<reference path="./Cartesian3.d.ts"/>
/* another import */

class Range3
{
    low: Cartesian3;
    /* more instance variables */

    /* truncated constructor */
    constructor(low?: Cartesian3)
    {
        this.low = Cesium.defined(low) ? <Cartesian3>low.clone() : new Cartesian3; // line that throws an error
    }

    /* more functions */
}

Range3.js(适用于该项目)如下所示:

define([
    './Cartesian3',
    /*another dependency*/
    ],
function(
    Cartesian3,
    /*other dependency */
    )
{
    function Range3(low)
    {
        this.low = Cesium.defined(low) ? low.clone() : new Cartesian3();
    }
    /* other functions defined here */
    return Range3;
});

我怀疑这是由于定义文件的执行不正确,但我无法查明问题。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

这不是一个完全解决方案,但我找到了解决方法。由于Javascript文件正在扩展Cesium对象的原型(Cartesian3),我将额外的函数添加到Cesium的d.ts文件中,用于Cartesian3,并删除了Cartesian3.d.ts,而不是引用Range3.ts中的Cesium.d.ts,这修复了错误。如果有人想要找到更好的解决方案,我很想知道。