type ClassA = class aaa{} function getClassA():typeof ClassA { return ClassA }
主要是为了统一入口动态导出类,但发现这样在另一个文件 Promise<classa>报,把值作为类使用。各位大佬怎么搞?</classa>
![]() | 1 oott123 2020-02-03 12:44:44 +08:00 via Android Promise<typeof ClassA> 哇 |
![]() | 2 zy445566 OP |
![]() | 3 maichael 2020-02-03 12:57:56 +08:00 @zy445566 #2 你这个返回的怎么会是 Promise 呢,又不是 async 包装,而且 ClassA() 和 ClassA 肯定是两个东西。 |
![]() | 4 zy445566 OP @maichael ```js function bbb():Promise<typeof ClassA> { return Promise.resolve(new ClassA()) } ``` 之前试过,回帖代码写快了,一样是报类型不一致 |
![]() | 6 zy445566 OP @maichael 那又回到了最初的问题 ClassA refers to a value, but is being used as a type here. ts(2749)。 报 ClassA 不是一个类,而是一个值,我感觉是 ts 没把 ClassA 在另一个文件注册为类导致的 |
![]() | 9 codehz 2020-02-03 13:57:33 +08:00 (那个,其实你直接写的话 返回值不用标记的。。。 然后 vscode 鼠标移动上去看自动推导的类型 |
![]() | 11 MrJeff 2020-02-03 14:21:00 +08:00 ``` type ClassA = class aaa{} class 声明的时候自带类型 不用再 typ 直接这样就行了 class ClassA {}; ``` |
![]() | 13 zy445566 OP @MrJeff 就是不通过 export 通过统一入口的一个方法来导出,我还尝试了 ```js getClassA():new ()=> ClassA{ return ClassA } ``` 也无法实现动态导出 |
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); })() ``` 大概这样? |
![]() | 17 zy445566 OP @fy136649111 我主要是为了给第二个文件做推导,实例本来就是可以生成的 |
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(); } |
19 islxyqwe 2020-02-04 09:08:48 +08:00 上面写错了点东西,看得懂就好( 平时你写 classA{},这个文件里就出现了一个 classA 的构造器值和一个 classA 的类型是实例的类型, 用方法返回的肯定只能是一个值,按你的导出,导出的是这个构造器 typeof 这个值获得的当然是构造器的类型,不是实例的 实例的类型用 InstanceType 泛型获取 |
![]() | 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); |