我已将项目从打字稿2.1.XX版本迁移到2.4.2。下面的文件是生成的jhipster,在编译文件时会给我错误:
错误TS2345:无法将类型'()=> void'的参数分配给类型'IServiceProvider'的参数。 类型'()=> void'中缺少属性'$ get'。
能否请您帮助我确定导致编译错误的原因。
namespace module.system {
"use strict";
angular
.module(module.appName)
.provider('AlertService', AlertService);
function AlertService () {
this.toast = false;
/*jshint validthis: true */
this.$get = getService;
this.showAsToast = function(isToast) {
this.toast = isToast;
};
getService.$inject = ['$timeout', '$sce'];
function getService ($timeout, $sce) {
let toast = this.toast,
alertId = 0, // unique id for each alert. Starts from 0.
alerts = [],
timeout = 5000; // default timeout
return {
factory: factory,
isToast: isToast,
add: addAlert,
closeAlert: closeAlert,
closeAlertByIndex: closeAlertByIndex,
clear: clear,
get: get,
success: success,
error: error,
info: info,
warning : warning
};
function isToast() {
return toast;
}
function clear() {
alerts = [];
}
function get() {
return alerts;
}
function success(msg, params, position) {
return this.add({
type: 'success',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function error(msg, params, position) {
return this.add({
type: 'danger',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function warning(msg, params, position) {
return this.add({
type: 'warning',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function info(msg, params, position) {
return this.add({
type: 'info',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function factory(alertOptions) {
let alert = {
type: alertOptions.type,
msg: $sce.trustAsHtml(alertOptions.msg),
id: alertOptions.alertId,
timeout: alertOptions.timeout,
toast: alertOptions.toast,
position: alertOptions.position ? alertOptions.position : 'top right',
scoped: alertOptions.scoped,
close: function (alerts) {
return closeAlert(this.id, alerts);
}
};
if(!alert.scoped) {
alerts.push(alert);
}
return alert;
}
function addAlert(alertOptions, extAlerts) {
alertOptions.alertId = alertId++;
let that = this;
let alert = this.factory(alertOptions);
if (alertOptions.timeout && alertOptions.timeout > 0) {
$timeout(function () {
that.closeAlert(alertOptions.alertId, extAlerts);
}, alertOptions.timeout);
}
return alert;
}
function closeAlert(id, extAlerts) {
let thisAlerts = extAlerts ? extAlerts : alerts;
return closeAlertByIndex(thisAlerts.map(function(e) { return e.id; }).indexOf(id), thisAlerts);
}
function closeAlertByIndex(index, thisAlerts) {
return thisAlerts.splice(index, 1);
}
}
}
}
答案 0 :(得分:1)
我不确定该代码之前如何成功编译,但现在可以看到问题了。如果您在IDE中跳转到provider
方法的声明(或在线查看声明here),则会看到provider
需要IServiceProviderFactory
(返回IServiceProvider
对象的函数)或IServiceProviderClass
(扩展IServiceProvider
的类/构造函数),其中在每种情况下,IServiceProvider
对象都是具有以下内容的对象:至少为$get
属性。看来您的AlertService
打算用作构造函数,但TypeScript不能这样识别它。 (在.ts
文件中,TypeScript仅将类识别为可构造的类。.js
文件有一些特殊情况。)
最简单的方法是在provider
的参数上使用类型断言。这不会检查AlertService
是有效的IServiceProvider
构造函数,但是如果自动生成AlertService
代码并且您希望最大程度地减少补丁数量,这可能是您的最佳选择必须这样做。
// In TypeScript 3.0 or newer, you can replace `any` with `unknown`.
angular
.module(module.appName)
.provider('AlertService', <angular.IServiceProviderClass><any>AlertService);
或者,您可以将AlertService
转换为实型。如果我没有犯任何错误,下面的方法应该起作用:
namespace module.system {
"use strict";
class AlertService {
toast = false;
$get($timeout, $sce) {
let toast = this.toast,
alertId = 0, // unique id for each alert. Starts from 0.
alerts = [],
timeout = 5000; // default timeout
return {
factory: factory,
isToast: isToast,
add: addAlert,
closeAlert: closeAlert,
closeAlertByIndex: closeAlertByIndex,
clear: clear,
get: get,
success: success,
error: error,
info: info,
warning : warning
};
function isToast() {
return toast;
}
function clear() {
alerts = [];
}
function get() {
return alerts;
}
function success(msg, params, position) {
return this.add({
type: 'success',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function error(msg, params, position) {
return this.add({
type: 'danger',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function warning(msg, params, position) {
return this.add({
type: 'warning',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function info(msg, params, position) {
return this.add({
type: 'info',
msg: msg,
params: params,
timeout: timeout,
toast: toast,
position: position
});
}
function factory(alertOptions) {
let alert = {
type: alertOptions.type,
msg: $sce.trustAsHtml(alertOptions.msg),
id: alertOptions.alertId,
timeout: alertOptions.timeout,
toast: alertOptions.toast,
position: alertOptions.position ? alertOptions.position : 'top right',
scoped: alertOptions.scoped,
close: function (alerts) {
return closeAlert(this.id, alerts);
}
};
if(!alert.scoped) {
alerts.push(alert);
}
return alert;
}
function addAlert(alertOptions, extAlerts) {
alertOptions.alertId = alertId++;
let that = this;
let alert = this.factory(alertOptions);
if (alertOptions.timeout && alertOptions.timeout > 0) {
$timeout(function () {
that.closeAlert(alertOptions.alertId, extAlerts);
}, alertOptions.timeout);
}
return alert;
}
function closeAlert(id, extAlerts) {
let thisAlerts = extAlerts ? extAlerts : alerts;
return closeAlertByIndex(thisAlerts.map(function(e) { return e.id; }).indexOf(id), thisAlerts);
}
function closeAlertByIndex(index, thisAlerts) {
return thisAlerts.splice(index, 1);
}
}
}
AlertService.prototype.$get.$inject = ['$timeout', '$sce'];
angular
.module(module.appName)
.provider('AlertService', AlertService);
}
此外,如果可以的话,我建议您升级到最新版本的TypeScript(当前为3.1.4)。一直在进行改进,包括对错误消息的改进,这些信息可能有助于您纠正以后的问题。