typescript - 我如何使用“typeof”从泛型类获取类型?
当我在 a.js 中声明一个泛型类 A 并导出它时,然后,我不知道如何在 b.js 中声明类 A 的变量。
下面的代码:a.js:
export let A = function<K extends { value: number }>(DEFAULT_NUMBER){
return class A<T> {
test(obj: T, num: number): K {
return obj.diff(DEFAULT_NUMBER, num);
};
};
}(
// DEFAULT_NUMBER
1000
);
b.jsimport { A } from "a.js";
class B {
diff(): { value: number } {
// ...
}
};
let a: InstanceType<typeof A<B>> = new A();
a.test(new B(), 50);
下面是更简单的代码:
let A = class<T> {};
class B {};
let a: InstanceType<typeof A<B>>; // throw a syntax error
// or
let a: InstanceType<(typeof A)<B>>; // throw a syntax error
// or
let a: InstanceType<typeof (A<B>)>; // throw a syntax error
// or
let a: (InstanceType<typeof A>)<B>; // throw a syntax error
// or
let a: InstanceType<typeof A>; // correct, but the type of a is `A<unknown>`
我应该如何声明变量a?
答案#1
我认为没有这种语法。对于用特定类型参数的泛型函数获取返回类型,肯定也没有语法。
一种方法是通过一个虚拟函数来实现:
let A = class<T> {};
class B {};
let aHelper = () => new A<B>();
let a: ReturnType<typeof aHelper>;
答案#2
据我所知,任何 .js 文件中都不应该有类型定义(例如 value: number)。相反,它们应该属于 .ts 文件(TypeScript 而不是 JavaScript)。
在 TypeScript 中,如果你有一个通用类定义如下:
export class A<T extends { something: number }> {
useSomething(obj: T) {
console.log(obj.something)
}
}
然后你可以这样使用它:
class B {
something: number
}
const a = new A<B>()
a.useSomething(new B())
