使用import语句会破坏其他类引用吗?

时间:2016-08-24 15:41:43

标签: typescript typescript-typings definitelytyped

作为my previous question关于专门使用bowser DefinitelyTyped定义文件的后续内容,我按照该问题中的答案的指示实现了import语句并进一步完成。但是现在TypeScript编译器抱怨在所有bowser import废话之前编译完全正常的代码。

我们说我有MyBowserClass.ts:



import bowser = require('bowser');

namespace MyNamespace {
    export class MyBowserClass {
        constructor() {
            var isIos = (typeof bowser.ios === 'undefined') ? false : bowser.ios;
            alert(isIos);

            var myInstance = new MyNamespaceTwo.MyOtherClass(); // typescript compiler complains: Property 'MyOtherClass' does not exist on type 'typeof MyNamespaceTwo'.
        }
    }
}




然后我有MyOtherClass.ts:



namespace MyNamespaceTwo {
    export class MyOtherClass {
        constructor() {
            alert('otherclass ctor');
        }
    }
}




编译器在这里给我一个错误:

var myInstance = new MyNamespaceTwo.MyOtherClass();

Property 'MyOtherClass' does not exist on type 'typeof MyNamespaceTwo'.

所以我想也许这意味着我还需要导入MyOtherClass

我通过更新我的两个文件来实现这个目的:



import bowser = require('bowser');
import otherClass = require('MyOtherClass'); // NEW IMPORT

namespace MyNamespace {
    export class MyBowserClass {
        constructor() {
            var isIos = (typeof bowser.ios === 'undefined') ? false : bowser.ios;
            alert(isIos);

            var myInstance = new otherClass.MyNamespaceTwo.MyOtherClass(); // changed this to prefix with 'otherClass'
        }
    }
}






export namespace MyNamespaceTwo { // made this EXPORT
    export class MyOtherClass {
        constructor() {
            alert('otherclass ctor');
        }
    }
}




这似乎完全混乱/疯狂。我在这里错过了什么?为什么bowser定义文件仍然是一个模块(当它由一个全局/基本上静态的方法名称组成时?)任何指导/帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

您似乎正在将文件从全局声明文件更改为模块声明文件。

  • 全局声明文件使您在整个项目中可以访问在其中声明的类型,而无需导入任何内容。全局声明文件永远不能从另一个文件导入。它们也从不出口,因为其中声明的类型随处可见。

    EG。使用redux的项目可以声明SpecialAction,然后可以在项目中的任何位置使用:

    // index.d.ts
    interface SpecialAction {
      type: string
      isSpecial: boolean
    }
    
    // src/app.ts
    let theAction: SpecialAction = {
      type: 'SPECIAL',
      isSpecial: true
    }
    
  • 模块声明文件将特定类型导出到模块,因此可以将导出导入到项目的其他位置。只要在声明文件中导入或导出,它就会成为模块声明文件。

    // index.d.ts
    import { Action } from 'redux'
    export interface SpecialAction extends Action {
      isSpecial: boolean
    }
    
    // src/app.ts
    import { SpecialAction } from '../index'
    let theAction: SpecialAction = {
      type: 'SPECIAL',
      isSpecial: true
    }
    

我希望这有帮助吗? ¯\_(ツ)_/¯