如何导出已导入的界面?

KFo*_*Fox 8 import module export interface typescript

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

这是一个简化的例子:

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

//app.ts
import myLib = require("lib/MyLib/MyLib"); // this works fine
Run Code Online (Sandbox Code Playgroud)

/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;
Run Code Online (Sandbox Code Playgroud)

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

// lib/MyLib/transport/vehicles.ts

export interface IAutomobile {
    weight: number
}

export class Car implements IAutomobile {
    weight = 3000
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

bas*_*rat 9

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

这在下面说明.a.ts:

export interface A {
    val: number;
}
Run Code Online (Sandbox Code Playgroud)

要从另一个文件重新导出它b.ts:

import a = require('./a');
export import B = a.A; // Important use of import
Run Code Online (Sandbox Code Playgroud)

其他文件中的示例用法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;
Run Code Online (Sandbox Code Playgroud)


att*_*ona 7

该示例按照TS 语言规范进行了重写:

a.ts:

export interface A {
   val: number;
}
Run Code Online (Sandbox Code Playgroud)

要从另一个文件重新导出该文件b.ts:

export {A} from './a'
Run Code Online (Sandbox Code Playgroud)

在其他文件中的用法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;
Run Code Online (Sandbox Code Playgroud)


Dou*_*las 6

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

该语言有点冗长,但这在语言规范的第 2.3 节中有详细说明