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

Typescript type definition nested namespace with interfaces

我想为 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

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

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

A namespace that contains no values or statements is considered an uninstantiated namespace, and has no runtime value.

您可以通过以下方式防止错误:

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
    }
}