【发布时间】:2021-02-26 16:06:29
【问题描述】:
我有一个单例类,它是 20x20 数组的扩展。 (我正在搜索单词。)我发现了这种用于导出单例类的实例的令人愉快的语法,它同时维护了实例的名称和类的名称:
const Grid = new class Grid extends Array<string[]> {
constructor(private readonly size = 20) {
super(size);
// ...
}
// ...
};
export default Grid;
Huzzah,效果很好。现在来测试。为了使事情易于管理,我想创建一个尺寸更小的新网格(可能是 8x8)。在 JavaScript 中,检索构造函数很容易。
import Grid from './grid';
const GridConstructor = Grid.constructor;
it('does a thing', () => {
const testGrid = new GridConstructor(8);
});
因为我知道参数期望什么,是的,我可以这样做并将GridConstructor声明为
const GridConstructor: new(size: number) => typeof Grid = Grid.constructor;
当然,这是合理的解决方案。不过,我不是一个理性的人,并且必须使用 TypeScript 打字引擎输入所有的东西。 (好吧,所以我真的很喜欢学习。谁知道这什么时候有用?)
TypeScript 认为 Grid.constructor 是 Function 类型。据我所知,它没有任何关于该函数形状的信息。
可以推断出那个形状吗?
我想到的最好的是:
type Constructor<T extends { constructor: new(...args: any[]) => any; }> =
new(...args: ConstructorParameters<T['constructor']>) => InstanceType<T['constructor']>;
const GridConstructor: Constructor<typeof Grid> = Grid.constructor;
这会导致错误:
Type 'Grid' does not satisfy the constraint '{ constructor: new (...args: any[]) => any; }'.
【问题讨论】:
标签: typescript