网站搜索

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.js
import { 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())