gpt4 book ai didi

typescript - 如何为默认导出包含类的对象的模块提供符合人体工程学的类型?

转载 作者:行者123 更新时间:2023-12-04 00:56:43 24 4
gpt4 key购买 nike

By "ergonomic" I mean "doesn't require consumers to use InstanceType<typeof mod["Foo"]> syntax"

我正在为 JS 源文件编写 .d.ts。几个月后,该 JS 文件将转换为 TS,但我们还不能转换它。

文件是这样的:

// module.js
class Foo {
sayFoo(){}
}

export default {
Foo
};

tsc 生成这样的 .d.ts:

// module.d.ts
declare class Foo {
sayFoo(): void;
}
declare const _default: {
Foo: typeof Foo;
};
export default _default;

调用者必须跳过一些非常奇怪的环节才能获得类类型:

import mod from "./module"

function takesFoo(foo: InstanceType<typeof mod["Foo"]>) {
foo.sayFoo();
}

但是如果我使用 namespace 对类型撒谎:

export default NS;
// module.d.ts
declare namespace NS {
export class Foo {
sayFoo(): void
}
}

然后调用者获得更好的类型级 API!

import mod from "./module";
function takesFoo(foo: mod.Foo) {
foo.sayFoo();
}

可以只使用namespace ,但是当我们将 JS 文件转换为 TS 时,我们陷入了困境。那时我们的选择是:

  • (A) 切勿将库入口点实际转换为 TS。在 TS 中编写大部分库,然后使用带有 .d.ts 的小型 JS 文件来包装 API。这将删除我们实际上符合我们的公共(public) API 的任何检查!这会让人感到困惑。

  • (B) 对调用者强制使用奇怪的类型级 API。或许可以通过导出一些接口(interface)来减轻打击,并让调用者了解 TS 类类型的人格 split 。

我是否遗漏了一个选项或不了解有关 TS 中类型级点的某些内容?

最佳答案

更新:它可能比我想象的要简单得多,尽管我关于如何使用默认导出的建议仍然有效......而且这可能实际上运行(进一步更新:如果我在一个简单的 create-react-app 生成的环境中尝试它似乎没问题。

使用您现有的默认导出,这似乎可以编译:

import { Foo } from "./module"

const x = new Foo();

function f(y: Foo) {
y.sayFoo();
}

f(x);

原始回复如下:

是否可以在 class Foo { 前自由添加 export

这样用户可以说:

import { Foo } from "./module";

然后直接使用Foo:

function takesFoo(foo: Foo) {

或者,如果 Foo 是唯一从模块中导出的东西,并且您希望它是默认导出的,那么单独导出它比将它包装在一个对象中更有意义:

export default Foo; 

所以用户可以导入它:

import Foo from "./module";

我认为 default export 的方式是,如果我只有一个东西要导出,它最有意义,在这种情况下为什么要把它包装在一个对象中?如果我有多个要导出的东西,我只是单独导出它们,以便可以根据需要使用 { ... } 导入它们。

关于typescript - 如何为默认导出包含类的对象的模块提供符合人体工程学的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58227613/

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