Angular2:提供的参数与调用目标的任何签名都不匹配

Lun*_*man 2 compiler-errors observable typescript angular

我创建了自己的Observable服务

import { Injectable, EventEmitter, Output} from '@angular/core';

@Injectable()
export class ObservableService {
    data = [];
    @Output eventEmitter:EventEmitter = new EventEmitter();

    setSharedData(key, value) {
        this.data[key] = value;
        this.eventEmitter.emit(this.data);
    }

    getSharedData() {
        return this.data;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个用法示例

ngOnInit() {
        this._observable.eventEmitter.subscribe((data) => {
            console.log(data);
        })
    }
Run Code Online (Sandbox Code Playgroud)

所以目前正在编译它说

app/services/data-observable.service.ts(6,5): error TS1240: Unable to resolve signature of property decorator when called as an expression.
  Supplied parameters do not match any signature of call target.
Run Code Online (Sandbox Code Playgroud)

这是指这个特殊的字符串,

@Output eventEmitter:EventEmitter = new EventEmitter();
Run Code Online (Sandbox Code Playgroud)

但服务工作完美,任何建议有什么不对?

Pie*_*Duc 5

你错过了括号Output().虽然Output()在服务中没有必要.这仅在组件或指令中是必需的,因为您可以(eventEmitter)="onEventEmit($event)"在模板中使用表示法.

另一方面,您缺少泛型的类型注释EventEmitter<T>:

eventEmitter: EventEmitter<any> = new EventEmitter();
Run Code Online (Sandbox Code Playgroud)

要么

eventEmitter: EventEmitter<boolean> = new EventEmitter<boolean>();
Run Code Online (Sandbox Code Playgroud)

在上面,EventEmitters应该只在里面使用@Component.如果您想要类似的功能,请使用Subjectfrom rxjs.

subject: Subject<boolean> = new Subject<boolean>();
Run Code Online (Sandbox Code Playgroud)