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); |