使用import语句会中断其他类引用



作为我之前关于具体使用bowser DefinitelyTyped定义文件的问题的后续,我根据该问题中的答案实现了import语句,并得到了进一步的解决。然而,现在TypeScript编译器会抱怨那些编译得很好的代码,在所有的浏览器导入无意义之前。

假设我有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定义文件应该是一个模块(当它由一个全局/本质上静态的方法名组成??)

看起来您正在将文件从全局声明文件更改为模块声明文件。

  • 一个全局声明文件使在其中声明的类型在整个项目中都可以访问,而不需要导入任何东西。全局声明文件永远不能从另一个文件导入。它们也永远不会导出,因为其中声明的类型在任何地方都可用。

    。使用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
    }
    

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

最新更新