首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查所需模块的类型,并根据其类型返回正确的对象

检查所需模块的类型,并根据其类型返回正确的对象
EN

Stack Overflow用户
提问于 2020-02-14 17:35:55
回答 1查看 131关注 0票数 0

在nodejs竞赛中,我想让您自由选择如何编写对可观察到的操作执行操作的类型记录模块(甚至javascript)。但是,我需要知道选择了哪种类型的函数,这样才能在可观测值上使用正确的运算符。更好地理解这个问题,看看下面的例子:

代码语言:javascript
运行
复制
import { Observable } from "rxjs";
import { concatMap, map } from "rxjs/operators";

function attachOperation( in$:Observable<MyObject>, modulePath:string ):Observable<MyObject>{

  //types of modules that can be loaded
  type ObservableOperation = ( x: Observable<MyObject> ) => Observable<MyObject>
  type PromiseOperation = (x: MyObject ) => Promise<MyObject>
  type FunctionOperation = (x: MyObject ) => MyObject

  const operation = require(modulePath)

  let outObservable:Observable<MyObject>

  if( /* is ObservableOperation type */ ){

    outObservable = operation(in$)

  }else if( /* is PromiseOperation type */ ){

    outObservable = in$.pipe( concatMap( myObj => operation( myObj ) ) )

  }else if( /* is FunctionOperation type */ ){

    outObservable = in$.pipe( map( myObj => operation(myObj) ) )

  }else{

    throw new Error('not valid operation module')

  }

  return outObservable

}

如何检查(在if语句中)加载了哪种类型的模块?

编辑:如果模块没有根据其类型返回正确的对象,则还需要抛出一个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-17 23:23:47

TypeScript不具备运行时类型检查的能力,因此,尽管您所描述的问题的解决方案是可能的,但我仍然建议减少您的问题/解决方案的“聪明”。

“动态”解决方案通常看起来非常有吸引力,但成功地实现这些解决方案很少值得麻烦。例如,通过对TypeScript导入进行静态分析并结合自定义代码生成将该类型的数据带入运行时,您可能会得到所需的结果。但我猜你真的不想走那条路。

您可以通过将行为绑定到导入路径来获得类似的结果,例如,来自类似于src/function/**/*.js的路径的导出作为函数处理,来自src/observable/**/*.js的导出作为可观察的工厂处理,等等。

错误处理在这里也变得更简单了。如果调用导出的函数而它不返回所期望的值,则可以抛出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60231080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档