gpt4 book ai didi

AngularJS TypeScript 服务错误

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:34 24 4
gpt4 key购买 nike

我在尝试向模块添加服务时遇到此错误。谁能帮忙指出问题所在?

Angular 1.5.11 和 TypeScript 2.2.2

ERROR in ./source/mainModule.ts
(185,33): error TS2345: Argument of type 'typeof AwesomeService ' is not
assignable to parameter of type 'Injectable<Function>'.
Type 'typeof AwesomeService ' is not assignable to type '(string | Function)[]'.
Property 'push' is missing in type 'typeof AwesomeService '.

这是我尝试添加服务的地方

export default angular.module('iris.service', [])
/* This line throws the error --> */.service('awesomeService', AwesomeService);

在一个单独的文件中,这是我创建服务的方式

export class AwesomeService extends OtherClass {

private static $inject = ['configService'];

constructor() {
super();
}
}

更新:

我看到如果我将 AwesomeService 更改为一个函数并将其导出,它就可以正常工作。有什么办法可以将类用于服务吗?看起来 @types/angular 指定 angular.module.service 的第二个参数应该是字符串或函数。

最佳答案

是的,您可以完全按照自己的意愿行事,只需编写更少的代码。

@types/angular 中的类型声明包括以下内容

declare global {
interface Function {
$inject?: ReadonlyArray<string>;
}
}

这增加了 Function 类型的声明。添加可选属性 $inject,以允许以类型安全和声明的方式将干净、可读的 AngularJS DI 注释添加到类和函数中,而无需难看的类型断言。

请注意,所有类和函数实际上都是函数。

你的类的问题是,虽然上面的 Function 类型扩充声明 $inject 是可选的,但它没有声明当它指定时,它可能是private

事实上,从语义上讲,它在很大程度上不是私有(private)的,因为它由 AngularJS 框架和其他潜在的工具读取。

要解决这个问题,只需写

export class AwesomeService extends OtherClass {

static $inject = ['configService']; // no private here.

constructor() {
super();
}
}

更详细的答案是,如果一个类型声明一个私有(private)成员(为此它需要是一个类)与另一个类型的公共(public)成员同名(所有接口(interface)成员都是公共(public)的),则两种类型被认为在结构上不兼容.

不幸的是,这个错误有点神秘。 private $inject 声明导致类型检查器立即删除 service 调用中的 Function 目标类型。然后它尝试匹配 Array 但失败了。

关于AngularJS TypeScript 服务错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43980776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com