我正在使用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代码的一部分,但这不应该阻止我在打字稿中操纵它们。
答案 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;