我的问题是为什么构造函数不接受实现某些接口的对象,它应该接受接口作为参数。
在下面的示例中,有WeatherData
类实现Subject
接口。
还有CurrentConditionDisplay
类接受Subject
作为构造函数中的参数。
问题是WeatherData
的构造函数不接受CurrentConditionDisplay
对象的实例。
TypeScript编译器只是喊叫
错误TS2346:提供的参数没有 匹配任何呼叫目标的签名。
Visual Studio代码显示此错误:
提供的参数与呼叫目标的任何签名都不匹配。 (本地 var)weatherData:WeatherStation.WeatherData
CurrentConditionDisplay.ts
/// <reference path="DisplayElement.ts" />
/// <reference path="Observer.ts" />
/// <reference path="Subject.ts" />
module Display {
export class CurrentConditionDisplay implements observer.Observer, DisplayElement {
weatherData: observer.Subject;
temperature: number;
humidity: number;
CurrentConditionDisplay(weatherData: observer.Subject) {
this.weatherData = weatherData;
this.weatherData.registerObserver(this);
}
// some code here
}
}
WeatherData.ts
/// <reference path="Subject.ts" />
/// <reference path="Observer.ts" />
module WeatherStation {
export class WeatherData implements observer.Subject {
// some code here
}
}
MyWeatherStation.ts
/// <reference path="WeatherData.ts" />
/// <reference path="CurrentConditionDisplay.ts" />
class MyWeatherStation {
MyWeatherStation() {
var weatherData: WeatherStation.WeatherData =
new WeatherStation.WeatherData();
var display: Display.CurrentConditionDisplay =
new Display.CurrentConditionDisplay(weatherData); //<--- error is here
weatherData.setMeasurements(10,20,30);
}
}
new MyWeatherStation();
是的,我只是喜欢Head First Design Patterns:)
答案 0 :(得分:1)
在TypeScript或ES6中声明构造函数的语法是:
class SomeClass {
constructor(your, args, here) { ... }
}
您已尝试编写C#版本:
class SomeClass {
SomeClass(your, args, here) { ... }
}
只使此代码有效(当方法名称与封闭类名相同时,没有什么特别的事情发生):
let x = new SomeClass();
x.SomeClass(my, arg, here);
您可能已经注意到在调试时没有运行任何构造函数代码;)