TypeScript Extend 命名空间

TypeScript Extend namespace

提问人:Ilia Bogov 提问时间:3/1/2023 最后编辑:Ilia Bogov 更新时间:3/2/2023 访问量:233

问:

我正在尝试了解如何使用命名空间的扩展。 比方说,我有命名空间


namespace a {
    export type x= number
    export type foo= () => void
}

我想在另外两个命名空间中使用它,而无需复制粘贴。 类似的东西

namespace b & a{
    export type y= number
}

namespace c & a{
    export type z= boolean
}

就像在 ts 类型中一样。

命名空间文档中没有任何内容可以回答我的问题。 任何帮助将不胜感激!

我尝试过的事情:

1)

namespace b{
    export namespace a {
        export type x = number
        export type foo= () => void
    }
    export type y = number
}

这不允许在 C 中重用 A。

2)

namespace b{
    export type x = a.x
    export type t = a.t
    export type y = number
}

这更好,但仍然很糟糕,如果我在 a 中导出了很多类型。

  1. 尝试使用类型, 它有效,但用途不那么美观
type a  = {
    x: number,
    t: () => void
}
type b = a&{
    y: number
}


const i :b.x = 1 // compilation error.
const i :b["x"] = 1 // works but not as beautiful as b.x
TypeScript OOP 命名空间

评论

0赞 jcalz 3/1/2023
如果你在命名空间中所做的只是导出 consts,也许你应该使用普通对象,就像这个 playground 链接所示。这对你有用吗?如果是这样,我可以写一个答案来解释;如果没有,您能否编辑问题中的代码以显示它不起作用的用例?
0赞 Ilia Bogov 3/15/2023
你是对的,这很令人困惑,试图简化。我需要导出类型,而不是常量。

答:

0赞 Teneff 3/2/2023 #1

我认为你把 s 和 s 混淆了consttype


如果有意导出 sconst

您可以定义为i

const i = b.x

它将被键入为const i: 1

操场


否则

您可以导出类型

namespace a {
    export type x = 1;
    export type t = () => { }
}

namespace b {
    export type x = a.x
    export type t = a.t
    export type y = 2
}

const i: b.x = 1 // here you can use it to type variable

操场


您可以将b.xtypeof a.x

namespace b {
    export type x = typeof a.x
    export type t = typeof a.t
    export type y = 2
}

const i: b.x = 1 // and once again you'll be able to type `i`

操场