Typescript类型定义带接口的嵌套命名空间

时间:2017-10-02 21:32:06

标签: javascript typescript ecmascript-6 typescript-typings

我想为Javascript项目定义输入。我们来考虑一个简化版本:

a
|
+ A.js
+ b
  |
  + B.js 

有一个文件夹' a',里面有文件夹' b',我想用它作为:

import { A } from "a"
import { B } from "a/b" 

我理想情况下想要的打字看起来像这样:

declare namespace a {
    interface A { }

    namespace b {
        interface B { }
    }
}

declare module "a" {
    export = a
}

declare module "a/b" {
    export = a.b
}

然而,这给了我错误Cannot use namespace 'a' as a value

我注意到如果我将接口更改为类,问题就解决了。有人可以说清楚为什么会这样吗?有没有办法通过接口获得这样的定义?

1 个答案:

答案 0 :(得分:2)

https://github.com/Microsoft/TypeScript/issues/17530

  

不包含任何值或语句的命名空间被视为未实例化的命名空间,并且没有运行时值。

您可以通过执行以下操作来阻止错误:

declare module "a/b" {
    import b = a.b
    export = b
}

但是,除非命名空间aa.b在运行时实际上可用作全局变量,否则您应该写:

declare module "a" {
    export interface A {
        foo: string
    }
}

declare module "a/b" {
    import {A} from 'a'
    export interface B {
        bar: A
    }
}