在nodejs竞赛中,我想让您自由选择如何编写对可观察到的操作执行操作的类型记录模块(甚至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语句中)加载了哪种类型的模块?
编辑:如果模块没有根据其类型返回正确的对象,则还需要抛出一个错误。
发布于 2020-02-17 23:23:47
TypeScript不具备运行时类型检查的能力,因此,尽管您所描述的问题的解决方案是可能的,但我仍然建议减少您的问题/解决方案的“聪明”。
“动态”解决方案通常看起来非常有吸引力,但成功地实现这些解决方案很少值得麻烦。例如,通过对TypeScript导入进行静态分析并结合自定义代码生成将该类型的数据带入运行时,您可能会得到所需的结果。但我猜你真的不想走那条路。
您可以通过将行为绑定到导入路径来获得类似的结果,例如,来自类似于src/function/**/*.js的路径的导出作为函数处理,来自src/observable/**/*.js的导出作为可观察的工厂处理,等等。
错误处理在这里也变得更简单了。如果调用导出的函数而它不返回所期望的值,则可以抛出。
https://stackoverflow.com/questions/60231080
复制相似问题