gpt4 book ai didi

typescript 导出类型和模块值

转载 作者:行者123 更新时间:2023-12-04 10:15:45 24 4
gpt4 key购买 nike

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

// foo.ts

export type Foo = string;

export function create(): Foo {
// ...
}
这种模式起作用的原因是什么:
// index.ts
import * as _Foo from "./foo";
export const Foo = _Foo;
export type Foo = _Foo.Foo;
但这些模式没有?
// No compiler error but value is not exported
export type Foo = import("./foo").Foo;
export * as Foo from "./foo";

// Duplicate identifier error
import type { Foo } from "./foo";
import * as Foo from "./foo";
export { Foo };

// Individual declarations in merged declaration 'Foo' must be all exported or all local. [2395]
import * as Foo from "./foo";
export { Foo };
export type Foo = Foo.Foo;

最佳答案

输入别名 do not produce a value .
让我解释一下你的例子中发生了什么

// 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;
编译版不包含类(class)类型
var _Foo = require("./foo");
exports.Foo = _Foo;
之后,如果 Foo用作正确解析为 string 的类型, 但如果 Foo被用作一个值它是一个带有 create 的对象 field 。
有趣的事实是您可以使用 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");
下一个有点棘手,说实话,我不知道为什么它不起作用。我想这可能是一个错误,因为 import type是一个 Shiny 的新功能,但我还没有找到它。
import type { Foo } from "./foo";
import * as Foo from "./foo";
export { Foo };
本地定义的类型有效:
type Foo = string;
import * as Foo from "./foo";
export { Foo };
最后一个,因为 Foo在此导入中声明的不能与其合并。你可以看看 this issue详情。
import * as Foo from "./foo";
export { Foo };
export type Foo = Foo.Foo; // <- local definition
它可以使用临时标识符重写,就像您在第一个示例中所做的那样:(它不起作用,请参阅下面的更新)
import * as _Foo from './Foo'
export { _Foo as Foo }
export type Foo = _Foo.Foo
更新
最后列出的片段会产生正确的 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.
这似乎是一个错误,但我找不到它已发布

关于typescript 导出类型和模块值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61065811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com