- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!