Javascript 从类调用公共函数,该类实现从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导入,但没有任何效果 我得到的不是用作值的模块和导入类型,但从解决方案中,我发现似乎需要添加无法更改的导出或

如何从typescript接口导入函数

在下面的示例中,如何从另一个文件调用
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();