我想为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
。
我注意到如果我将接口更改为类,问题就解决了。有人可以说清楚为什么会这样吗?有没有办法通过接口获得这样的定义?
答案 0 :(得分:2)
https://github.com/Microsoft/TypeScript/issues/17530
不包含任何值或语句的命名空间被视为未实例化的命名空间,并且没有运行时值。
您可以通过执行以下操作来阻止错误:
declare module "a/b" {
import b = a.b
export = b
}
但是,除非命名空间a
和a.b
在运行时实际上可用作全局变量,否则您应该写:
declare module "a" {
export interface A {
foo: string
}
}
declare module "a/b" {
import {A} from 'a'
export interface B {
bar: A
}
}