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

2020-02-03 12:40:57 +08:00
 zy445566
type ClassA = class aaa{}
function getClassA():typeof ClassA {
	return ClassA
}

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

3305 次点击
所在节点    程序员
21 条回复
oott123
2020-02-03 12:44:44 +08:00
Promise<typeof ClassA> 哇
zy445566
2020-02-03 12:49:37 +08:00
@oott123
```js
function bbb():Promise<typeof ClassA> {
return new ClassA()
}

```
不行,比如上面会报类型不一致
maichael
2020-02-03 12:57:56 +08:00
@zy445566 #2 你这个返回的怎么会是 Promise 呢,又不是 async 包装,而且 ClassA() 和 ClassA 肯定是两个东西。
zy445566
2020-02-03 13:02:27 +08:00
@maichael
```js
function bbb():Promise<typeof ClassA> {
return Promise.resolve(new ClassA())
}
```
之前试过,回帖代码写快了,一样是报类型不一致
maichael
2020-02-03 13:08:31 +08:00
@zy445566 #4 你这个用直接用 ClassA,不要用 typeof ClassA
zy445566
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
2020-02-03 13:17:45 +08:00
@zy445566 #6 用 InstanceType<ClassA>
zy445566
2020-02-03 13:33:06 +08:00
@maichael 没明白,能写一段么
codehz
2020-02-03 13:57:33 +08:00
(那个,其实你直接写的话
返回值不用标记的。。。
然后 vscode 鼠标移动上去看自动推导的类型
zy445566
2020-02-03 14:10:06 +08:00
@codehz 不行,推导结果是: Promise<unknown>
MrJeff
2020-02-03 14:21:00 +08:00
```
type ClassA = class aaa{} class 声明的时候自带类型 不用再 typ
直接这样就行了
class ClassA {};
```
zy445566
2020-02-03 14:25:18 +08:00
@MrJeff 这其实是我写错了,我其实就是要把这个类在另一个文件使用,且这个类必须通过方法来导出
zy445566
2020-02-03 14:27:22 +08:00
@MrJeff 就是不通过 export 通过统一入口的一个方法来导出,我还尝试了
```js
getClassA():new ()=> ClassA{
return ClassA
}
```
也无法实现动态导出
Kaakira
2020-02-03 16:21:15 +08:00
@zy445566 这样是可以的 a~
const anonymousA = new (getClassA())();
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
2020-02-03 21:48:27 +08:00
@Kaakira 我主要是为了给第二个文件做推导,实例本来就是可以生成的
zy445566
2020-02-03 21:49:01 +08:00
@fy136649111 我主要是为了给第二个文件做推导,实例本来就是可以生成的
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
2020-02-04 09:08:48 +08:00
上面写错了点东西,看得懂就好(
平时你写 classA{},这个文件里就出现了一个 classA 的构造器值和一个 classA 的类型是实例的类型,
用方法返回的肯定只能是一个值,按你的导出,导出的是这个构造器
typeof 这个值获得的当然是构造器的类型,不是实例的
实例的类型用 InstanceType 泛型获取
zy445566
2020-02-04 09:26:26 +08:00
@islxyqwe 好吧,如果我希望 promise 接收的是实例而不是类呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX