V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zy445566
V2EX  ›  程序员

刚接触 typescript,如何将类通过方法导出?

  •  
  •   zy445566 ·
    zy445566 · 2020-02-03 12:40:57 +08:00 · 3289 次点击
    这是一个创建于 1546 天前的主题,其中的信息可能已经有所发展或是发生改变。
    type ClassA = class aaa{}
    function getClassA():typeof ClassA {
    	return ClassA
    }
    

    主要是为了统一入口动态导出类,但发现这样在另一个文件 Promise<classa>报,把值作为类使用。各位大佬怎么搞?</classa>

    第 1 条附言  ·  2020-02-03 14:14:33 +08:00
    感觉是另一个问题,如何将类动态导出,而不是类的引用动态导出
    第 2 条附言  ·  2020-02-03 21:49:11 +08:00
    我主要是为了给第二个文件做推导,实例本来就是可以生成的
    第 3 条附言  ·  2020-02-04 09:27:05 +08:00
    目前放弃了,用 any 顶一顶了
    21 条回复    2020-02-04 09:57:44 +08:00
    oott123
        1
    oott123  
       2020-02-03 12:44:44 +08:00 via Android
    Promise<typeof ClassA> 哇
    zy445566
        2
    zy445566  
    OP
       2020-02-03 12:49:37 +08:00
    @oott123
    ```js
    function bbb():Promise<typeof ClassA> {
    return new ClassA()
    }

    ```
    不行,比如上面会报类型不一致
    maichael
        3
    maichael  
       2020-02-03 12:57:56 +08:00
    @zy445566 #2 你这个返回的怎么会是 Promise 呢,又不是 async 包装,而且 ClassA() 和 ClassA 肯定是两个东西。
    zy445566
        4
    zy445566  
    OP
       2020-02-03 13:02:27 +08:00
    @maichael
    ```js
    function bbb():Promise<typeof ClassA> {
    return Promise.resolve(new ClassA())
    }
    ```
    之前试过,回帖代码写快了,一样是报类型不一致
    maichael
        5
    maichael  
       2020-02-03 13:08:31 +08:00
    @zy445566 #4 你这个用直接用 ClassA,不要用 typeof ClassA
    zy445566
        6
    zy445566  
    OP
       2020-02-03 13:13:12 +08:00
    @maichael 那又回到了最初的问题 ClassA refers to a value, but is being used as a type here. ts(2749)。
    报 ClassA 不是一个类,而是一个值,我感觉是 ts 没把 ClassA 在另一个文件注册为类导致的
    maichael
        7
    maichael  
       2020-02-03 13:17:45 +08:00
    @zy445566 #6 用 InstanceType<ClassA>
    zy445566
        8
    zy445566  
    OP
       2020-02-03 13:33:06 +08:00
    @maichael 没明白,能写一段么
    codehz
        9
    codehz  
       2020-02-03 13:57:33 +08:00
    (那个,其实你直接写的话
    返回值不用标记的。。。
    然后 vscode 鼠标移动上去看自动推导的类型
    zy445566
        10
    zy445566  
    OP
       2020-02-03 14:10:06 +08:00
    @codehz 不行,推导结果是: Promise<unknown>
    MrJeff
        11
    MrJeff  
       2020-02-03 14:21:00 +08:00
    ```
    type ClassA = class aaa{} class 声明的时候自带类型 不用再 typ
    直接这样就行了
    class ClassA {};
    ```
    zy445566
        12
    zy445566  
    OP
       2020-02-03 14:25:18 +08:00
    @MrJeff 这其实是我写错了,我其实就是要把这个类在另一个文件使用,且这个类必须通过方法来导出
    zy445566
        13
    zy445566  
    OP
       2020-02-03 14:27:22 +08:00
    @MrJeff 就是不通过 export 通过统一入口的一个方法来导出,我还尝试了
    ```js
    getClassA():new ()=> ClassA{
    return ClassA
    }
    ```
    也无法实现动态导出
    Kaakira
        14
    Kaakira  
       2020-02-03 16:21:15 +08:00
    @zy445566 这样是可以的 a~
    const anonymousA = new (getClassA())();
    fy136649111
        15
    fy136649111  
       2020-02-03 16:32:01 +08:00
    ```
    class aaa {

    }

    async function getClassA(): Promise<typeof aaa> {
    return aaa
    }

    (async () => {
    const b = new (await getClassA())();
    console.log(b);
    })()

    ```
    大概这样?
    zy445566
        16
    zy445566  
    OP
       2020-02-03 21:48:27 +08:00 via Android
    @Kaakira 我主要是为了给第二个文件做推导,实例本来就是可以生成的
    zy445566
        17
    zy445566  
    OP
       2020-02-03 21:49:01 +08:00 via Android
    @fy136649111 我主要是为了给第二个文件做推导,实例本来就是可以生成的
    islxyqwe
        18
    islxyqwe  
       2020-02-04 08:52:37 +08:00
    写个伪代码
    declare function requireClassA():Promise<typeof ClassA>;
    async ()=>{
    const c = await requireClassA();
    const b:InstanceType<typeof c> =new a();
    }
    islxyqwe
        19
    islxyqwe  
       2020-02-04 09:08:48 +08:00
    上面写错了点东西,看得懂就好(
    平时你写 classA{},这个文件里就出现了一个 classA 的构造器值和一个 classA 的类型是实例的类型,
    用方法返回的肯定只能是一个值,按你的导出,导出的是这个构造器
    typeof 这个值获得的当然是构造器的类型,不是实例的
    实例的类型用 InstanceType 泛型获取
    zy445566
        20
    zy445566  
    OP
       2020-02-04 09:26:26 +08:00 via Android
    @islxyqwe 好吧,如果我希望 promise 接收的是实例而不是类呢?
    noe132
        21
    noe132  
       2020-02-04 09:57:44 +08:00
    要分清楚类型和值

    class A {}
    const a = new A()

    其中 a 是值,代表 A 的实例
    A 既是值也是类型,作为值的时候代表 A 本身,作为类型时代表 A 的实例类型
    A(值)本身的类型呢? typeof A
    怎么通过类的类型获取实例类型? InstanceType<T>

    class A {}
    const a: A = new A();

    type AClassType = typeof A // 类的类型
    const B: AClassType = A;
    const a2: A = new B();
    const a3: InstanceType<AClassType> = new A();

    type Factory = () => A;
    const factory: Factory = () => new A();

    type Factory2 = <T extends { new(...p: any): any }>(c: T) => InstanceType<T>;
    const factory2: Factory2 = (C) => new C();

    const a4: A = factory2(A);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1440 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:15 · PVG 01:15 · LAX 10:15 · JFK 13:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.