typescript - 以正确的方式导入命名空间
问题描述
如何使用与当前文件命名空间相同或不同的命名空间中的类?
目前我有以下2个文件。类型A.ts:
export namespace Game {
@ccclass
export class TypeA extends cc.Component {
protected onLoad(): void {
// do something
}
}}
TypeB.ts:
import * s from "some url";
export namespace Game {
@ccclass
export class TypeB extends s.Game.TypeA {
protected onLoad(): void {
// do something
}
}}
正如您所看到的导入部分,vscode 说 'as' 是预期的,但目前我可以键入任何字符串并且它以某种方式工作。TypeB 的延伸部分看起来又丑又长。
我怎样才能让它只是 TypeB 扩展 TypeA 因为两者都具有相同的命名空间?实际上,我仍然计划将大量差异类/组件放在同一个命名空间下,我应该这样做吗?或者只是删除导出命名空间部分,让每个导出类更容易访问?
解决方案
就像任何其他类型的声明一样,如果两个具有相同名称的命名空间被定义在相同的范围内,则它们只是“相同的命名空间”:全局或相同的父命名空间或外部模块。在您的示例中,您有两个不同的命名空间,名为Game
,每个模块中都有一个。如果您想从两个模块添加到相同的命名空间,您可以在 TypeA.ts 中使用以下内容:
declare global {
namespace Game {
class TypeA extends cc.Component {
onLoad(): void;
}
}
}
Game.TypeA = <any>function(this: Game.TypeA) {
// constructor
};
Game.TypeA.prototype.onLoad = function() {
// do something
};
在 TypeB.ts 中也是如此。如您所见,这变得非常难看,因为declare global
can 仅包含声明,并且必须单独修补实现。您最好遵循 Cerberus 的建议来选择名称空间或外部模块。
推荐阅读
- python - 列表中的相同对象
- c# - 用于多个事件处理程序的 C# 异步事件
- sequelize.js - Sequelize中定义belongsTo关系时as和foreignKey的区别
- flutter - SliverChildBuilderDelegate 使用 setState 更改数据时不重建其子级
- opencv - 从单应性中获得正确的旋转和平移
- r - 如何使用 SQLDF 执行类似的查询?
- api - Softlayer:IBM Cloud:用于搜索和检索帐户 > 审计日志的 API 调用
- excel - 行内的 COUNTIFing 我已经在 COUNTIFing
- c - 读取变量直到变量处于 C 中给定区间的宏
- gcc - cmake mingw 忽略 -Wl,--gc-sections