如何导出已导入的界面?

时间:2014-07-28 16:32:38

标签: interface import module export typescript

我正在使用typescript创建一个库,该库分布在多个文件中。我获取了我定义的所有类和常量,并将它们导入到一个模块中,该模块将它们全部导出到一个名称空间下。我刚刚定义了一个接口,我希望将它包含在与我库的所有其他部分相同的命名空间/模块中。但显然我不能。

这是一个简化的例子:

/app.ts是应用程序的入口点,我现在所做的只是包含我的库MyLib:

//app.ts
import myLib = require("lib/MyLib/MyLib"); // this works fine

/lib/MyLib/MyLib.ts是我导入MyLib定义的所有内容并将它们一起导出的文件:

// lib/MyLib/MyLib.ts

import VehiclesImport = require("./transport/vehicles");
// error under  VehiclesImport.IAutomobile, saying that VehiclesImport has no property IAutomobile
export var IAutomobile = VehiclesImport.IAutomobile; 
export var Car = VehiclesImport.Car;

在/lib/MyLib/transport/vehicles.ts中,我定义了几个车辆的类和接口,在这里,我将只展示IAutomobile和Car:

// lib/MyLib/transport/vehicles.ts

export interface IAutomobile {
    weight: number
}

export class Car implements IAutomobile {
    weight = 3000
}

我尝试在MyLib.ts中创建一个类卡车,它正确实现了IAutomobile,并且工作正常,没有任何错误消息。当我想在'implements'语句之外访问IAutomobile时,似乎只会出现这个问题。

我很抱歉,如果这看起来像'代码转储',但在我看来,这是一个严重的问题,除了在类声明中我无法访问我的接口。我在过去的两个小时里搜索过谷歌,但没有发现任何关于此问题的信息。谢谢你能给我的任何帮助!

编辑:我知道打字稿界面不是已编译的javascript代码的一部分,但这不应该阻止我在打字稿中操纵它们。

4 个答案:

答案 0 :(得分:9)

使用import关键字将某些内容引入类型声明空间(而不是var,将其带入变量声明空间)。

以下说明。 a.ts

export interface A {
    val: number;
}

要从其他文件b.ts重新导出:

import a = require('./a');
export import B = a.A; // Important use of import

其他文件c.ts中的示例用法:

import b = require('./b');

var foo: b.B;
foo.val = 123;

interface C extends b.B {
    val2:number;
}

var bar: C;
bar.val2 = 456;

答案 1 :(得分:4)

在TS language specification之后重写的示例:

a.ts

export interface A {
   val: number;
}

要从其他文件b.ts重新导出:

export {A} from './a'

在其他文件中使用c.ts

import {A} from './b'

var foo: A = {val: 2};
foo.val = 123;

interface C extends A {
    val2:number;
}

var bar: C = {val: 1, val2: 3};
bar.val2 = 456;

答案 2 :(得分:2)

类型不能分配给变量,它们存在于不同的“声明空间”中。可以将类分配给变量,因为它们将名称提供给类型声明空间以及定义类对象。接口只对类型声明空间有贡献,因此不能作为值引用。

语言有点冗长,但language spec

第2.3节详细说明了这一点。

答案 3 :(得分:0)

foo.ts

export interface ITest {
  ...
}

bar.ts

import * as foo from "./foo";

export type ITest = foo.ITest;