如何创建窗口中已存在的类

时间:2017-02-24 19:37:26

标签: javascript typescript

我想创建一个名为Text的类,但是我收到了错误。

  

重复的标识符'文字'

class Text extends MyOtherClass {
    // Do stuff
}

这已经是Window上存在的JavaScript类。我相信我可以将它添加到另一个对象,但我不知道这是否是最好的做法。

我有哪些选项,以便我可以使用TextObject或窗口中已定义的任何其他项目?

我想也许我可以使用namespace,但我不确定这是否有效,或者它是否按照我想要的方式工作。我在浏览器中运行最终代码,它不支持模块,所以我不想做一个我认为命名空间的模块路径。

namespace MyNamespace {
    class Text extends MyOtherClass {
        // Do stuff
    }
}

当我试图这样称呼它时:

myFunction(MyNamespace.Text);

我收到此错误:

  

财产'文字' mynamespace'

的类型'类型不存在

3 个答案:

答案 0 :(得分:3)

如果您打算创建一个类Text并在不触及全局Text的情况下使用它,答案取决于您是否将代码拆分为小模块(又称“外部模块”)我强烈建议)或者您的所有代码是否都在同一个文件中(“内部模块”或namespace)。

外部模块

假设您在Text中定义了课程fileA.ts

export class Text {
  // class implementation goes here
}
// Other classes, variables etc

然后在您的消费文件fileB.ts中(为简单起见,假设位于同一文件夹中),import Text

import {Text} from './fileA'

// Use Text normally
var a = new Text();

fileB.ts中,Text将是用户定义的,而不是全局Text

内部模块

在同一档案fileA.ts中:

namespace SomeName {
  export class Text {
    // Implementation
  }
}

var a = new SomeName.Text();

如果另一方面你要修改全局Text类型本身,除非有充分理由你不应该这样做,你可以通过Text添加新的属性/方法>

declare global {
  interface Text {
    // New stuff goes here
  }
}

有关详细信息,请参阅here。这需要TypeScript 1.8及更高版本。

答案 1 :(得分:1)

如果要创建具有相同名称的类,可以使用命名空间。但是你必须将它称为namespace.class。它会工作。您不能在同一名称空间中多次创建同一个类。

答案 2 :(得分:1)

要在其父命名空间声明之外使用命名空间类型,必须从命名空间export编辑。如果未导出,则在其父namespace声明之外可用。如果您使用相同的命名空间,则适用甚至

以下是一个例子:

namespace Example {
    class Search {
        searchKey = document.getElementById('');
    }
    export class OtherSearch {

    }
    type Primary = '123';
    export type Secondary = '123';

}

Example.OtherSearch; // No Error
Example.Search; // Compile Error

namespace Example {
  class SecondSearch {
    // Compile error: Example.Primary is not visible even though its the same namespace.
    alpha() : Example.Primary {

    }
    beta(): Example.Secondary {
      return null;
    }
  }
}