Javascript 从类调用公共函数,该类实现从typescript中的另一个文件导出的接口
如何从typescript接口导入函数 在下面的示例中,如何从另一个文件调用Javascript 从类调用公共函数,该类实现从typescript中的另一个文件导出的接口,javascript,typescript,import,Javascript,Typescript,Import,如何从typescript接口导入函数 在下面的示例中,如何从另一个文件调用foo namesapce a{ export interface b{ foo():number; } class c implements b{ public foo():number{...} } } 我尝试了import=和import require和import{}从as导入,但没有任何效果 我得到的不是用作值的模块和导入类型,但从解决方案中,我发现似乎需要添加无法更改的导出或
foo
namesapce a{
export interface b{
foo():number;
}
class c implements b{
public foo():number{...}
}
}
我尝试了import=
和import require
和import{}从as
导入,但没有任何效果
我得到的
不是用作值的模块
和导入类型,但从解决方案中,我发现似乎需要添加无法更改的导出或更改代码。您不能在此处使用导入
或导出
。实例方法foo
属于类c
,它是全局脚本范围内a
的成员(因此文件不是模块)
另外,c
as包含的类没有导出,因此foo
也不是公共的。唯一可用的名称空间成员是接口b
,它只包含c
的类型声明,没有实现(b
将在运行时擦除)
通常,脚本范围内的命名空间a
可以这样使用(无导入):
假设您希望使用名称空间并更改c
的导出,则可以使用以下代码片段调用foo
,将其粘贴到文件中,而无需在顶层导入/导出
:
namespace a {
export interface b {
foo(): number;
}
export class c implements b {
public foo(): number {
return 42;
}
}
}
const cInstance = new a.c()
cInstance.foo()
即使名称空间只是全局名称空间中命名的JavaScript对象。
从typescript中,您可以修改代码并按如下方式使用它(假设此代码存在于namespace-a.ts文件中)
例1:
export namespace a {
export interface b {
foo(): number;
}
export class c implements b {
public foo(): number {
console.log('calling foo from class c');
return 123;
}
}
}
在另一个文件中,您可以像这样导入它
import*作为名称空间a从“../location到file/namespace-a”代码>
在您的代码中,您可以按如下方式使用它:
let testVar = new namespaceA.a.c();
testVar.foo();
注意:如果您阅读文档,则认为上述做法不好
为了重申为什么不应该尝试为模块内容命名,命名空间的一般思想是提供构造的逻辑分组并防止名称冲突。由于模块文件本身已经是一个逻辑分组,并且其顶级名称由导入它的代码定义,因此无需为导出的对象使用额外的模块层
您应该只修改代码如下。在文件fileBC.ts中:
例2:
export interface b {
foo(): number;
}
export class c implements b {
public foo(): number {
console.log('calling foo from class c');
return 1;
}
}
在另一个文件中,按如下方式使用它:
import*作为fileBC从“../location到file/fileBC”代码>
let testVar = new fileBC.c();
testVar.foo();
附言:很抱歉,我对文件和变量使用了不好的名称,但你可以理解这一点。我讨厌我的变量命名。我希望这有帮助
let testVar = new fileBC.c();
testVar.foo();