typescript导出类型和模块值

typescript导出类型和模块值,typescript,es6-modules,Typescript,Es6 Modules,我想导出与值同名的类型。下面是一个示例模块: //foo.ts 导出类型Foo=string; 导出函数create():Foo{ // ... } 这种模式起作用的原因是什么: //index.ts 从“/Foo”导入*作为“Foo”; 导出常量Foo=\u Foo; 导出类型Foo=\u Foo.Foo; 但这些模式没有 //没有编译器错误,但未导出值 出口类型Foo=进口(“./Foo”).Foo; 将*从“/Foo”导出为Foo; //重复标识符错误 从“/Foo”导入类型{Foo}

我想导出与值同名的类型。下面是一个示例模块:

//foo.ts
导出类型Foo=string;
导出函数create():Foo{
// ...
}
这种模式起作用的原因是什么:

//index.ts
从“/Foo”导入*作为“Foo”;
导出常量Foo=\u Foo;
导出类型Foo=\u Foo.Foo;
但这些模式没有

//没有编译器错误,但未导出值
出口类型Foo=进口(“./Foo”).Foo;
将*从“/Foo”导出为Foo;
//重复标识符错误
从“/Foo”导入类型{Foo};
从“/Foo”导入*作为Foo;
出口{Foo};
//合并声明“Foo”中的单个声明必须全部导出或全部本地。[2395]
从“/Foo”导入*作为Foo;
出口{Foo};
导出类型Foo=Foo.Foo;
键入别名

让我解释一下你的例子中发生了什么

// Types (Foo) and values (create) are imported into a single variable
import * as _Foo from "./foo"; 

// The module is reexported with another name
export const Foo = _Foo;

// The type is reexported with another name
export type Foo = _Foo.Foo;
编译版本不包含课程类型

var _Foo = require("./foo");
exports.Foo = _Foo;
在此之后,如果将
Foo
用作类型,它将正确解析为
string
,但如果将
Foo
用作值,它将是一个具有
create
字段的对象

有趣的是,您现在可以使用
typeof Foo
,它将是
{create:()=>string}

前进 以下内容与前面的内容基本相同,但由于第一次导入显式声明它是一种类型,因此可以对值导出使用相同的名称

export type Foo = import("./foo").Foo; // does not produce a variable
export * as Foo from "./foo"; // named value export
汇编成

exports.Foo = require("./foo");
下一个有点棘手,老实说,我不知道为什么它不起作用。我想这可能是一个bug,因为导入类型是一个闪亮的新特性,但我没有找到它

import type { Foo } from "./foo";
import * as Foo from "./foo";
export { Foo };
本地定义的类型工程:

type Foo = string;
import * as Foo from "./foo";
export { Foo };
最后一个,因为在这个导入中声明了
Foo
,所以不能与它合并。您可以查看详细信息

import * as Foo from "./foo";
export { Foo }; 
export type Foo = Foo.Foo; // <- local definition
更新

最后列出的代码段生成正确的js输出,但在将导出用作值时抛出错误:

import * as _Foo from './merged'
const x: Foo = '1234'; // Ok
const y = Foo.create(); // <- TS2693: 'Foo' only refers to a type, but is being used as a value here.
import*作为_Foo从“./merged”
常量x:Foo='1234';//好啊

常量y=Foo.create();//JavaScript输出与预期的一样,但我无法让您提到的重新导出解决方案正常工作:
import * as _Foo from './merged'
const x: Foo = '1234'; // Ok
const y = Foo.create(); // <- TS2693: 'Foo' only refers to a type, but is being used as a value here.