带有接口的 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
}
但是,除非命名空间 a
和 a.b
在运行时实际上可用作全局变量,否则您应该这样写:
declare module "a" {
export interface A {
foo: string
}
}
declare module "a/b" {
import {A} from 'a'
export interface B {
bar: A
}
}
我想为 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
}
但是,除非命名空间 a
和 a.b
在运行时实际上可用作全局变量,否则您应该这样写:
declare module "a" {
export interface A {
foo: string
}
}
declare module "a/b" {
import {A} from 'a'
export interface B {
bar: A
}
}