我有两种几乎相似的方法:
private firstFunction () {
this.serviceOne.methodOne().subscribe(
res => {
return resultOne = res;
},
err => {}
);
}
private secondFunction () {
this.serviceTwo.methodTwo().subscribe(
res => {
return resultTwo = res;
},
err => {}
);
}
我想写一个通用函数,如下所示:
genericFunction (service ,method , result ) {
service.method().subscribe(
res => {
return result = res;
},
err => {}
);
}
因此,我想让这样的东西发挥作用:
genericFunction (serviceOne , methodOne , resultOne );
genericFunction (serviceTwo , methodTwo , resultTwo );
实际上,我找不到如何传递method One
和method Two
作为参数。有什么建议吗?
请尝试使用以下代码:
private firstFunction () {
let response= genericFunction(this.serviceOne.methodOne())
}
private secondFunction () {
let response = genericFunction(this.serviceTwo.methodTwo())
}
通过接收一个变量来修改通用函数。
//if it is angular 4 or less
genericFunction (method: Observable) {
return method.map(res => {
return res.json();
});
}
//if it is angular 5 or 6
genericFunction (method: Observable) {
return method.pipe(
map(res => {
return res;
}));
}
代码中有几个问题。
首先,您希望修改作为参数传入的字段(如result=res
所建议)。您不能传入对字段的引用,但可以传入字段名称,并使用索引来更改字段。keyof t
将允许您以类型安全的方式传入字段。
其次,如果您想访问服务上的方法。同样,我们可以通过传入方法名来完成这项工作,并且我们可以约束服务使用传入的方法名来拥有一个方法,该方法返回一个可观察的
。可观察的
的结果也可以被约束为我们将要分配给它的字段的同一类型,以便该方法是完全类型安全的。
declare class Service1 {
method1() : Observable<number>
}
declare class Service2 {
method2() : Observable<string>
}
class MyClass {
resultOne!: number;
resultTwo!: string;
constructor() {
this.genericFunction(new Service1(), "method1", "resultOne");
this.genericFunction(new Service2(), "method2", "resultTwo");
this.genericFunction(new Service1(), "method1", "resultTwo"); // error resultTwo is a string, the method return Observable<number>
this.genericFunction(new Service2(), "method", "resultTwo"); // error method does not exit on Service2
this.genericFunction(new Service2(), "method2", "resultTwo2"); // error field does not exist on type
}
genericFunction<MethodKey extends string, ResultKey extends keyof MyClass>(service:Record<MethodKey, ()=> Observable<MyClass[ResultKey]>>, method:MethodKey, result: ResultKey){
service[method]().subscribe(
res => this[result] = res,
err => {}
);
}
}
注意,我们也可以将函数作为函数传入,不仅仅是作为名称,而是直接作为类型化函数。这样做的缺点是,我们必须使用bind
来确保服务方法在调用时仍然具有正确的this
,或者在调用时使用箭头函数(再次确保服务方法具有正确的this
)。这是容易出错的,但是,bind
会导致未键入的函数,所以我们不能检查与字段的兼容性,有人可能会直接传递service.method
,直到运行时才会报告错误:
class MyClass {
resultOne!: number;
resultTwo!: string;
constructor() {
var service1 = new Service1()
var service2 = new Service2()
this.genericFunction(()=> service1.method1(), "resultOne");
this.genericFunction(()=> service2.method2(), "resultTwo");
this.genericFunction(service2.method2, "resultTwo"); // no error, depending on the implementation of method2 it might or might not work
this.genericFunction(service2.method2.bind(service2), "resultOne"); // no error, the service call will work, but we store it in an incompatible variable
this.genericFunction(()=> service1.method1(), "resultTwo");// error resultTwo is a string, the method return Observable<number>
this.genericFunction(()=> service2.method2(), "resultTwo2");// // error field does not exist on type
}
genericFunction<MethodKey extends string, ResultKey extends keyof MyClass>(method:()=> Observable<MyClass[ResultKey]>, result: ResultKey){
method().subscribe(
res => this[result] = res,
err => {}
);
}
}
我想在方法中传递一个JFrame作为参数,可以吗? 这里是我想要的:
我有静态方法在我的类 这就是定义 这里用的是 这是我得到的一个错误 E0167类型为“void(TV_DepthCamAgent::)(int count,int copied_file)”的参数与类型为“void()(int,int)”的参数不兼容 错误C3867“TV_DepthCamAgent::progress_callback”:非标准语法;使用' 我做错了什么?
我有一个lambda表达式,我希望能够传递和重用。代码如下: 这里的关键是,我希望能够将我在这里使用的lambda表达式传递到调用此代码的方法中,以便可以重用它。lambda表达式是我的。查询方法。我假设我想使用Action或Func,但我不太确定它的语法是什么,或者它是如何工作的。谁能给我举个例子吗?
我正在编写一个方法,如果我想将一个类传递给一个方法,其中代码的一部分包括检查对象是否属于某种类型。这就是我想要的(但显然不行): 关于如何做到这一点有什么提示吗?谢谢!
问题内容: 我试图将选择的A类“获取”方法传递给B类中的方法。我已经将Java PassMethod作为Parameter签出,但是我无法以合理的方式采用接口方法解决问题。我宁愿 不 使用Java 8(lambdas),并尽可能避免反射。我的感觉是,我以错误的方式看待自己的问题。这是我要完成的工作的特定简化示例: 我有一个包含一些字段和get-method的类: 接下来,我将主类实例化为Map的V
问题内容: 码: 当我尝试: 我在Eclipse中收到错误。 但当: 一切都好。为什么会有这种差异?谢谢。 问题答案: 因为语法是特殊的语法糖,仅在初始化数组变量时才适用。这是因为任务本身缺少类型信息;但是在赋值的特殊情况下,类型是从变量中完全推断出来的。 在第一个示例中,编译器知道您要分配给它(是),因此允许使用此语法。在后者中,您无需初始化变量(并且由于Java类型推断的弱点,它甚至也无法完全